与CMake和Visual Studio的链接助推2015年
问题描述:
当我尝试使用cmake生成的Visual Studio 2015年文件与升压链接,cmake的生成库路径是这样的:与CMake和Visual Studio的链接助推2015年
optimized;D:/work/libs/boost_1_63_0/lib64-msvc-14.0/boost_regex-vc140-mt-1_63.lib;debug;D:/work/libs/boost_1_63_0/lib64-msvc-14.0/boost_regex-vc140-mt-gd-1_63.lib;[...]
但视觉工作室试图链接libboost_regex-vc140-mt-gd-1_63.lib
从使用此路径的cmake文件生成解决方案文件。
的cmake的文件的相关部分:上述
target_compile_definitions(${PROJECT_NAME} [...] BOOST_ALL_DYN_LINK)
message("${Boost_LIBRARIES}")
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
的optimized
和debug
路径是从这里message(...)
命令和视觉工作室输出是
2>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc140-mt-gd-1_63.lib'
哪个是正确的,因为它应使用boost_regex-vc140-mt-gd-1_63.lib
,这是${Boost_LIBRARIES}
中的绝对路径。
奇怪认为,当是find_package
之前使用set(Boost_USE_STATIC_LIBS ON)
,问题是完全倒过来,cmake的发现libboost_
文件,而VS预计boost_
文件。
答
看来,主要的问题是,我连接到我的图书馆的另一个图书馆被静态链接到提升。
当我动态链接我的项目与提升,这工作,但链接其他库现在没有找到所需的静态版本,因为主要项目不包括静态版本到其路径(这是正确的行为我的项目),而链接的库似乎不包括静态链接的链接,而只是为了以后以某种方式进行链接而引用它们。
目前,它的工作是确保所有部件都与静态或动态版本链接,而无需混合。
它可能与两个路径中的工作,但我想然后它会弄糊涂哪个库用于哪个功能。
'libboost_regex-vc140-mt-gd-1_63.lib'对应于boost :: regex的静态版本,我猜想CMake想链接静态库。你可以尝试在你的CMakeLists中添加'target_link_libraries($ {PROJECT_NAME} Boost :: dynamic_linking)',或者在你的'find_package(Boost)''之前设置(Boost_USE_STATIC_LIBS OFF)''? – oLen
我加了两个,它不会改变错误。我认为当它按预期工作时,''Boost_LIBRARIES''应该包含''libboost_regex-vc140-mt-gd-1_63.lib''文件作为绝对路径,不应该吗? – allo
您还可以看看Visual Studio解决方案想要从项目属性链接什么,至少应该将其作为绝对路径给出。 – oLen