使用CMake将共享库链接至可执行程序时Windows平台运行异常问题排查
Windows下CMake DLL项目调用函数无输出/调试失败的解决方案
嘿,这个问题我太熟了——根本原因就是你的DLL函数没正确导出!在Windows上,getNumber()根本没被放进SHLib.dll的导出符号表里,Main.exe调用它的时候直接触发了运行时崩溃,所以你看不到任何输出,连断点都没法正常命中。
问题出在哪?
看你的foo.cpp实现:
#include <SHLib/foo.h> int getNumber() { return 7; }
你在头文件里费劲定义了LIBRARY_API来处理Windows的导出/导入逻辑,但实际写函数实现的时候,完全没给getNumber()加上LIBRARY_API修饰!这就导致编译SHLib.dll时,编译器根本不知道要把这个函数导出到DLL里,Main.exe加载DLL后找不到这个函数的入口,直接崩溃退出,自然就看不到后面的输出了。
怎么修复?
只需要修改SHLib/foo.cpp,给函数加上LIBRARY_API修饰符就行:
#include <SHLib/foo.h> LIBRARY_API int getNumber() { return 7; }
验证修复是否成功
修复后,你可以用Windows自带的dumpbin工具确认一下:
打开VS开发者命令提示符,切换到SHLib的编译输出目录,执行:
dumpbin /exports SHLib.dll
如果输出里能看到getNumber的条目,就说明导出成功了,再运行Main.exe就能看到预期的输出了。
为啥Linux下没问题?
这是跨平台动态库的差异:Linux的.so动态库默认会导出所有非静态的全局函数,不需要额外标记;但Windows的DLL正好相反,默认不导出任何函数,必须显式用__declspec(dllexport)(也就是你定义的LIBRARY_API)标记要导出的符号,这就是你在两个平台上看到不同结果的原因。
内容的提问来源于stack exchange,提问作者user680891
相关产品推荐
相关产品推荐

