导航:首页 > 源码编译 > 编译动态库时需要加入函数声明

编译动态库时需要加入函数声明

发布时间:2022-07-11 21:11:35

㈠ 一个C++项目, 已有一些静态库(.lib)和所有的函数声明(.h),怎么生成一个动态库(dll)

link /lib /list xxx.lib
可以列出这个lib文件里的所有obj文件

link /lib /extract:xxx.obj xxx.lib
可以从lib里拆解出一个obj文件

配合/nologo参数和for命令
把里面的obj文件全部拆出来
for /f "delims=" %a in ('link /lib /list /nologo xxx.lib') do link /lib /extract:"%a" xxx.lib

然后根据.h文件自己写个def文件,用link重新链接一下就行了。
def文件还是要自己写的……
或者你看看能不能用mpbin把lib导出的函数名字都列出来,然后处理一下做成def文件

㈡ “自定义函数在调用之前,必须进行函数声明,否则编译会出错”这句话为什么是错误的

这句话是错误的,只有定义在调用之后的函数才需要声明,如果定义在调用之前的函数,无需声明,例子1,定义在调用之后,必须声明:
main(){
int f();//这个声明是必须的
printf("%d",f());

}
int f(){return 1;}
例子2,定义在调用之前,无需声明:
int f(){return 1;}
main(){
/*int f();//这个声明不需要*/
printf("%d",f());

}最后,这个其实是历史遗留问题,以前的效率较低,编译器多次扫描源程序麻烦,现代编译器为了实现优化,都会反复多次扫描源程序。

㈢ 请问C语言中所谓的函数声明是指什么为什么要进行声明什么叫做函数声明

举个例子来说明吧
void foo();

int main()
{
foo();
}

void foo()
{
;
}

以上代码中,第一句就是所谓函数声明。
其实直接用函数定义也就是void foo(){;}替代第一句也是可以的,不过函数的声明让你可以在定义它的代码段之前使用它。

比如以上的例子中,在编译进行到main函数中的foo调用的时候,foo函数还是没有定义的,但我们通过foo的声明告诉了编译器:foo是一个函数的名字,这个函数有着怎样怎样的参数表等等。

linux c动态链接库 函数名称怎么声明

出现该错误的原因为编译时只变编译了源文件的一部分,故在链接时无法从编译好的目标代码中找到print函数,所以出错。 根据你的源文件结构,个人推荐先单独编译源文件为多个object文件,再统一链接。 方法如下 gcc -c main.c # -c参数的作用是让g...

㈤ 在 c++ 程序中调用被 c 编译器编译后的函数,为什么要加 extern "c" 声明

C++为了处理函数重载需要把参数信息写入到函数名,这导致编译后的函数名和源文件中的不同。而C中没有这个机制。当在C++中声明来自C的函数原型或者在C++中为C写函数实现的时候,必须加上extern "C"表示这个函数要保留原有的函数名(同时也会禁用函数重载)。

㈥ c++动态链接的声明和实现函数 怎么做成动态链接库

动态链接库的使用方法,动态链接库的动态调用(也叫显式调用)可以运用了,但是静态调用(也叫隐式调用)这种很少见。

(一)先回顾一下,动态链接库和静态链接库
静态链接库:lib中的函数不仅被连接,全部实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的。
动态链接库:dll不必被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名链接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时可以直接动态地引用和卸载DLL文件。
同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。

(二)回顾一下VC++支持的DLL:
DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。

(三)导出函数的声明方式:
一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
LIBRARY 库工程名称
EXPORTS 导出函数名

(四)DLL的调用方式:
静态调用中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
动态调用中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。

接下来写个例子把上面提到的理论都实践一遍。

一、 函数----创建动态链接库(MFC规则DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll
2. def文件中添加:函数名(Add_new)
3. h文件中添加:外部函数声明//求和函数,函数名为Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp文件中添加: 外部函数实现
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需

二、 函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)
//静态调用(.h可以写到.cpp文件中)
1. new--projects--win32 console application--an empty project
2. 添加h文件:(test.h)
#pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数
3. 添加cpp文件:(main.cpp)
#include "test.h"
int main()
{
cout<<Add_new(10,3);
return 0;
}
//动态调用
#include <stdio.h>
#include <windows.h>
typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型
int main()
{
HINSTANCE hDll;//句柄
lpAddFun addFun;//函数指针
hDll=LoadLibrary("dllTest.dll");//动态加载DLL模块句柄
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加载DLL模块中函数的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);//释放已经加载的DLL模块
}
return 0;
}

三、 变量----创建动态链接库(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 添加sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 添加 sample.cpp
#include "sample.h"
#include <windows.h>
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,LPVOID lpReserved)
//windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。所以引入一个不做任何操作的缺省DllMain的函数版本。是DLL的内部函数。


有一点要注意,如果看到此类宏定义
#ifdef KSCANBAR_EXPORTS
#define KSCANBAR_API __declspec(dllexport)
#else
#define KSCANBAR_API __declspec(dllimport)
#endif
是因为这样定义一般出现在含有多个项目的解决方案中,这样可以使从 DLL 导出更简单的宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KSCANBAR_EXPORTS符号编译的。在使用此 DLL 的任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将KSCANBAR_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的符号视为是被导出的。

阅读全文

与编译动态库时需要加入函数声明相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:579
python员工信息登记表 浏览:376
高中美术pdf 浏览:161
java实现排列 浏览:512
javavector的用法 浏览:981
osi实现加密的三层 浏览:233
大众宝来原厂中控如何安装app 浏览:915
linux内核根文件系统 浏览:242
3d的命令面板不见了 浏览:525
武汉理工大学服务器ip地址 浏览:148
亚马逊云服务器登录 浏览:524
安卓手机如何进行文件处理 浏览:70
mysql执行系统命令 浏览:929
php支持curlhttps 浏览:142
新预算法责任 浏览:444
服务器如何处理5万人同时在线 浏览:250
哈夫曼编码数据压缩 浏览:426
锁定服务器是什么意思 浏览:383
场景检测算法 浏览:617
解压手机软件触屏 浏览:350