提升VS2017链接到错误的DLL

时间:2017-05-23 11:02:55

标签: visual-studio boost cmake

我有一个CMake文件可以执行此操作:

find_package(Boost COMPONENTS system filesystem)

add_library(MyModule MODULE main.cpp)
target_include_directories(MyModule PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(MyModule Boost::system Boost::filesystem)

我使用VS 2017作为我的发电机。当我使用cmake生成项目文件时,它会找到boost_system-vc141-mt-1_63.lib,我可以看到它在vcxproj的链接规则中。但是,当我尝试编译时,我收到此错误:

  

LINK:致命错误LNK1104:无法打开文件' libboost_system-vc140-mt-1_63.lib

请注意不同的生成器(vc140 vs vc141)。我知道我的编译器输出了正确的值,因为我从源代码构建了boost,所以我试图将vc141重命名为vc140,但错误保持不变。我还确认项目文件中没有引用vc140。

发生了什么?如何强制提升链接到正确的版本?

1 个答案:

答案 0 :(得分:2)

使用Visual Studio构建时,boost有一些pragma语句可以为您进行链接。这被称为"自动链接"并且它会覆盖您可能传递给链接器的任何命令行参数。

解决方案是定义BOOST_ALL_NO_LIB。这可以通过两种方式完成:

  1. 在包含boost标头#define BOOST_ALL_NO_LIB之前的源代码中。
  2. 可以将其添加到您的cmake文件中:add_definitions("-DBOOST_ALL_NO_LIB")
  3. 从CMake 3.5开始:使用disable_autolinking导入的目标:

    target_link_libraries(MyModule Boost::system Boost::filesystem Boost::disable_autolinking)