【问题标题】:DLL functions not exported when build in release configuration在发布配置中构建时未导出 DLL 函数
【发布时间】:2016-08-22 06:05:33
【问题描述】:

在我的 C++ DLL 项目中,当我在调试配置中构建项目时,它运行良好。

函数使用 .def 文件导出:

LIBRARY "calc"
EXPORTS
findMaxFreqEXL = findMaxFreq
findMinSpeedEXL = calcMinSpeed
findMaxSpeedEXL = calcMaxSpeed
createProfileEXL = createProfile
arrayTestEXL = arrayTest
setLimitsEXL = setLimits

这些功能在我的项目中都定义为:

double _stdcall findMaxFreq(double &dCutLength, double &dCutTime, double &dSealTime, double &dCutSpeed, double &dDoughHeight, double* limitArray)
{
Calc *calcObj = new Calc();
calcObj->setLimits((int)limitArray[0], (int)limitArray[1], (int)limitArray[2], (int)limitArray[3], limitArray[4], limitArray[5], (int)limitArray[6], (int)limitArray[7], (int)limitArray[8], (int)limitArray[9], (int)limitArray[10]);
double maxFreq = calcObj->calcMaxFreq((float) dCutLength, (float) dCutTime, (float) dSealTime, (float) dCutSpeed, (float) dDoughHeight);

//delete calcObj;
return maxFreq;
}

其余的功能以此类推。

生成的 DLL 文件大小为 192 kb,根据 dumpbin,这些是导出的函数:

Dump of file C:\Redacted\Debug\calcDLL.dll

File Type: DLL

Section contains the following exports for calc.dll

00000000 characteristics
57B17EE6 time date stamp Mon Aug 15 10:35:50 2016
    0.00 version
       1 ordinal base
       6 number of functions
       6 number of names

ordinal hint RVA      name

      1    0 00013339 arrayTestEXL = @ILT+820(?arrayTest@@YGHPAN@Z)
      2    1 00013460 createProfileEXL = @ILT+1115(?createProfile@@YGHAAN00000PAN11@Z)
      3    2 000138E8 findMaxFreqEXL = @ILT+2275(?findMaxFreq@@YGNAAN0000PAN@Z)
      4    3 00013744 findMaxSpeedEXL = @ILT+1855(?calcMaxSpeed@@YGNAAN00@Z)

      5    4 00013500 findMinSpeedEXL = @ILT+1275(?calcMinSpeed@@YGNAAN00@Z)

      6    5 000134F6 setLimitsEXL = @ILT+1265(?setLimits@Calc@@QAEXHHHHHHHHHHH@Z)

Summary

    1000 .data
    2000 .idata
    5000 .rdata
    2000 .reloc
    1000 .rsrc
   28000 .text
   12000 .textbss

在发布配置中,文件只有 10 kb,dumpbin 说:

Dump of file C:\Redacted\Release\calcDLL.dll

File Type: DLL

Summary

    1000 .data
    1000 .rdata
    1000 .reloc
    1000 .rsrc
    2000 .text

我使用 Visual Studio Express 2013。知道我缺少什么吗?

【问题讨论】:

  • 我认为处理器宏可能有问题。
  • @Afshin 所说的:与其发布相当不相关的完整 dumpbin 输出,不如发布您如何在代码中导出函数。
  • @stijn:添加了导出函数的代码...
  • 更改调试配置的设置但忘记为发布设置进行设置是一个非常常见的错误。这里最明显的不幸是发布配置仍然将链接器 > 输入 > 模块定义文件设置为空白。否则,最好提醒您更喜欢 __declspec(dllexport)。

标签: c++ dll visual-studio-2013


【解决方案1】:

您显示的所有内容都还可以,所以我猜您只是忘记在项目设置中为发布配置设置导出文件。转到项目属性->链接器->输入并设置模块定义文件。

另外:您有内存泄漏,因为您没有删除 calcObj。但实际上这里没有理由使用堆,只是在堆栈上使用Calc calcObj;。也知道将 double 转换为 int 会被截断,你有没有想过如果数字 > 2^31 会发生什么?

【讨论】:

  • 你先生真棒!而且你对内存泄漏是正确的,我忘记了我还没有修复那个部分......整数应该是整数,但是 excel 将它们读取为双精度数,所以截断没问题,溢出部分另一方面...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2017-03-09
相关资源
最近更新 更多