如何使用CMake生成vs项目,链接到一些.dll文件

时间:2010-11-16 23:45:06

标签: visual-studio cmake

我使用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 (不参考某个项目)文件。我可以遵循任何严格的步骤吗?

由于

1 个答案:

答案 0 :(得分:3)

  • 在Windows上,您需要链接 .lib 而不是 .dll ,这是愚蠢的,但Microsoft使用相同的 .lib 静态动态库的扩展。 ***.lib中的某处应该${***_Test_SOURCE_DIR}/../../Build/Win32/Release/

    LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/Win32/Release/***.lib)
    
  • 如果不是这样,您可以按照本文从.libHow 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