问题描述:
我在写一个生成动态链接库dll的C++程序时,win32平台下的Debug与Release版本都能正常生成DLL文件与导出库LIB文件,即Debug版本下会生成SFD_APId.lib与SFD_APId.dll,Release版本下会生成SFD_API.lib与SFD_API.dll。但是x64平台下的Debug与Release版本都无法正常生成lib文件,dll文件倒是有生成。比如在Release版本下,总是提示错误信息如下:
SFD_API64.def : error LNK2001: 无法解析的外部符号 SFD_API64
1>E:\2_软件开发\SFD_API\SFD_API\bin\x64\Release\SFD_API64.lib : fatal error LNK1120: 1 个无法解析的外部命令。
如下图所示:
即链接器无法理解SFD_API64这个符号。
情况描述:
我用的Visual Studio 2019,SFD_API是我的项目名称,我是用模块定义文件来设计我的导出库,从而保证函数名不变化。即通过SFD_APId.def,SFD_API.def,SFD_API64d.def,SFD_API64.def国个导出库分别对应win32与x64两个平台下分别Debug与Release两种配置。我无法理解为什么Win32下可以正常生成想要的库文件,而x64就是不行。因为用模块定义文件作为对导出库文件的定义这种方式我之前就用过,并没有遇到现在的这个问题。我实在想不清楚, 为什么没法识别SFD_API64d或者SFD_API64这两个符号。从类比的角度来说,也只是比SFD_API多了个64而已。所以我还是觉得问题出现在属性设置上。
解决过程:
我对比了现在的模块定义文件与之前项目的模块定义文件,并没有发现关键字上有什么错误。同时也对比了win32下的属性设置与x64下的属性设置,在链接器中也并没有什么特别的不一样。我试过在项目路径添加到附加包含目录下,没有用。也试过重新改变项目文件的路径,也没有用。最后我也不知道操作了什么,在再一次打开def模块定义文件后,重新生成,竟然成功了。但作为一个不太成熟的程序员,我也知道,解决一个bug至少要分三步。第一步:代码能够正常运行。第二步:把修改后的点删除,bug会重现。第三步:再一次将修改后的点加上,bug解决,代码能够正常运行。但是我自己也没高明白,到底修改了哪里,也就是好像并没有改哪里,问题就解决了,自己也没法复现这个问题。经过多次尝试,发现问题竟然是def模块定义文件中在定义了导出库名称后,在EXPORTS关键字后要换行,因为我还没有正式写入要导出的函数名,刚把模块定义文件写出前两行,即下面这样:
所以就不行,而加了一个换行之后,即这样:
就可以正常生成了,经过多次尝试,都是可以的。能正常生成lib文件 与dll文件了。
结论感想:
只能说个人水平太次,这些问题正常来说应该很好解决,但我还是花了不少时间来处理这个问题。也是经过实践才解决的问题,说得不好听点,就是各种乱试才解决的。并最终找到问题出在哪里。但为什么会这样,我也不太清楚,还请各位大佬指正。