Visual studio Boost VS2017链接到错误的DLL

Visual studio Boost VS2017链接到错误的DLL,visual-studio,boost,cmake,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) 我使用VS2017

我有一个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)
我使用VS2017作为我的发电机。当我用
cmake
生成项目文件时,它会找到
boost_system-vc141-mt-1_63.lib
,我可以看到它在vcxproj的链接规则中。但是,当我尝试编译时,我得到以下错误:

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

注意不同的发电机(vc140与vc141)。我知道我的编译器输出了正确的值,因为我从源代码构建了boost,所以我尝试将vc141重命名为vc140,但错误保持不变。我还确认项目文件中未提及vc140


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

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

解决方案是定义
BOOST\u ALL\u NO\u LIB
。这可以通过两种方式实现:

  • 在源代码中,将boost头包含为
    #定义boost_ALL_NO_LIB
  • 它可以作为:
    添加定义(“-DBOOST\u ALL\u NO\u LIB”)
    添加到您的cmake文件中
  • 从CMake 3.5开始:使用
    禁用_自动链接
    导入的目标:

    target\u link\u库(MyModule Boost::system Boost::filesystem Boost::disable\u autolinking)


  • 在下面添加了我的解决方案。发布了这个,这样我以后遇到同样的问题时可以找到它。当我找到解决方案时,是因为一位同事提到了“自动链接”。否则我就不会找到解决方案。只是一个提示:我认为第二个解决方案行不通。它只定义一个名为
    BOOST\u ALL\u NO\u LIB
    的CMake缓存变量。如果我看一下,它会说一个解决方案是添加
    Boost::disable_autolinking
    依赖项,比如
    target_link_库(MyModule Boost::system Boost::filesystem Boost::disable_autolinking)
    @Florian,答案中的两个解决方案都为我解决了这个问题,但你的建议也是如此。向上投票。:)我写这篇文章已经有几个月了。从那以后,我了解了Florian的
    Boost::disable_autolinking
    ,它是在cmake 3.5中引入的,可以确认这是真正的方式。