gpt4 book ai didi

c++ - 在发布配置中构建时未导出 DLL 函数

转载 作者:行者123 更新时间:2023-11-30 03:39:02 25 4
gpt4 key购买 nike

在我的 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。知道我缺少什么吗?

最佳答案

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

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

关于c++ - 在发布配置中构建时未导出 DLL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39072302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com