我使用Cmake生成VS项目,基于一些dll文件
if(WIN32)
MESSAGE(WINDOWS)
LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/Win32/Release/***.dll)
else(WIN32)
MESSAGE(POSIX)
LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/POSIX/lib***.so)
endif(WIN32)
但是当我打开生成的项目时,构建并抛出
\***.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B0
有人有想法吗?
如果不使用CMake,如何在VS项目中添加外部dll (不参考某个项目)文件。我可以遵循任何严格的步骤吗?
由于
答案 0 :(得分:3)
在Windows上,您需要链接 .lib 而不是 .dll ,这是愚蠢的,但Microsoft使用相同的 .lib 静态和动态库的扩展。 ***.lib
中的某处应该${***_Test_SOURCE_DIR}/../../Build/Win32/Release/
。
LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/Win32/Release/***.lib)
如果不是这样,您可以按照本文从.lib
:How To Create 32-bit Import Libraries Without .OBJs or Source构建.dll
。简要地(取自Adrian Henke’s Blog),在VS命令提示符下:
dumpbin /exports C:\yourpath\yourlib.dll
这将向控制台打印相当多的文本。但是我们只对这些功能感兴趣:
ordinal hint RVA name
1 0 00017770 jcopy_block_row
2 1 00017710 jcopy_sample_rows
3 2 000176C0 jdiv_round_up
4 3 000156D0 jinit_1pass_quantizer
5 4 00016D90 jinit_2pass_quantizer
6 5 00005750 jinit_c_coef_controller
...etc
现在复制所有这些函数名称(仅限名称!)并将它们粘贴到新的文本文件中。将下一个文件命名为yourlib.def,并将行“EXPORTS”放在其顶部。我的yourlib.def文件如下所示:
EXPORTS
jcopy_block_row
jcopy_sample_rows
jdiv_round_up
jinit_1pass_quantizer
jinit_2pass_quantizer
jinit_c_coef_controller
...
现在从该定义文件中,我们最终可以创建.lib文件。我们使用“lib”工具,因此在Visual Studio命令提示符中运行此命令:
lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib