You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:18:12