方法
- 使用extern "C"修饰
- 设置统一的调用约定
举例
-
例1——使用
__cdecl
,一般C编译器使用此约定,如LabWidnows/CVI。- cpp代码
lib里导出的符号extern "C" __declspec(dllexport) uint32 __cdecl glFindDevices(uint32* devCnt);
__imp__glOpenDevice _glOpenDevice
- cpp代码
-
例2,实际VC默认使用
__stdcall
。-
cpp代码
extern "C" __declspec(dllexport) uint32 glFindDevices(uint32* devCnt);
lib里导出的符号
imp__glOpenDevice@8 _glOpenDevice@8
-
-
VC项目属性里可以设置默认的调用约定。
结论
- 如果使用
lib
文件静态链接dll
文件,要保证调用约定和编译器是一致的,否则会因为“找不到外部符号”导致链接失败。 - 不推荐使用
DEF文件
导出函数名称,可能会导致C链接器找不到符号。 - 推荐使用
__declspec(dllexport)
和__declspec(dllexport)
导出导入符号。