c++ - 将 DLL 中的 C++ 函数导出为 C 时 Debug 和 Release 之间的区别

标签 c++ c visual-studio dll

我正在构建一个 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/

相关文章:

C++ 转换为派生结构和父结构

c++ - 队列不添加对象 - C++ 11

c++ - 在 visual studio 中使用 xtensor 时的尖括号 <> 问题

visual-studio - Visual Studio 2015 完全离线分发

C++ 空字符串构造函数

c++ - 声明一个 double 给它一个值 0 但打印结果意外改变

c - 如何使用递归[C]对数字进行求和?

c - C有类吗?

c - Mongodb:C 驱动程序中的可尾游标具有最新的 "_id"

visual-studio - 我如何告诉 Visual Studio 调试器永远不要进入特定文件?