【问题标题】:Boost VS2017 linking to the wrong DLLBoost VS2017 链接到错误的 DLL
【发布时间】:2017-05-23 11:02:55
【问题描述】:

我有一个执行此操作的 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 与 vc141)。我知道我的编译器输出了正确的值,因为我从源代码构建了 boost,所以我尝试将 vc141 重命名为 vc140,但错误保持不变。我还确认项目文件中没有引用vc140。

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

【问题讨论】:

  • 在下面添加了我的解决方案。发布这个,以便我以后遇到同样的问题时可以找到它。当我找到解决方案时,是因为一位同事提到了“自动链接”。否则我不会找到解决方案。

标签: visual-studio boost cmake


【解决方案1】:

使用 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)

【讨论】:

  • 只是一个提示:我认为第二种解决方案行不通。这只定义了一个名为 BOOST_ALL_NO_LIB 的 CMake 缓存变量。如果我查看documentation,它会说一种解决方案是添加Boost::disable_autolinking 依赖项,例如target_link_libraries(MyModule Boost::system Boost::filesystem Boost::disable_autolinking)
  • @Florian,答案中的两种解决方案都为我解决了这个问题,但您的建议也是如此。到处点赞。 :)
  • 我写这篇文章已经几个月了。从那以后,我了解到 Florian 的 Boost::disable_autolinking 是在 cmake 3.5 中引入的,并且可以确认它是真正的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多