我正在构建一个 DLL,它将其函数导出为“C”。
我正在使用虚拟函数进行测试:
在我的.cpp 文件中
_MACRO(int) testFunction1()
{
return 1;
}
在我的头文件中
_MACRO(int) testFunction1();
这个宏定义为
# define _MACRO(ret) extern __declspec (dllimport) ret __stdcall
# define _MACRO(ret) __declspec (dllexport) ret __stdcall
因为我希望将这些函数导出为 C,所以我这样做了
\Debug>dumpbin /exports demo.dll
这正确地给了我一个输出
ordinal hint RVA name
1 0 000026C0 testFunction1 = testFunction1
但是当我对 Release 做同样的事情时
\Release>dumpbin /exports demo.dll
我明白了:
1 0 00001080 testFunction1 = _get_startup_argv_mode
如何让它打印出发布配置的函数名?发布设置有任何变化吗?
最佳答案
您看到的是 COMDAT 折叠(合并相同函数定义)的结果。
COMDAT 折叠在 Release 模式下默认激活(/OPT:ICF
)。要禁用,您可以使用 /OPT:NOICF
。
但是你为什么要这样做呢?它不会破坏您的 Release DLL 或任何东西。
当您看到 testFunction1 = testFunction1
时,第一部分是实际的导出名称,第二部分是相应的调试符号。
如果链接时没有调试符号,您只会看到 testFunction1
,而没有 =
部分。
关于c++ - 将 DLL 中的 C++ 函数导出为 C 时 Debug 和 Release 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50841206/