我有一个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。
发生了什么?如何强制提升链接到正确的版本?
答案 0 :(得分:2)
使用Visual Studio构建时,boost有一些pragma
语句可以为您进行链接。这被称为"自动链接"并且它会覆盖您可能传递给链接器的任何命令行参数。
解决方案是定义BOOST_ALL_NO_LIB
。这可以通过两种方式完成:
#define BOOST_ALL_NO_LIB
之前的源代码中。 add_definitions("-DBOOST_ALL_NO_LIB")
。从CMake 3.5开始:使用disable_autolinking
导入的目标:
target_link_libraries(MyModule Boost::system Boost::filesystem Boost::disable_autolinking)