CMake将显式Boost库路径转换为-lboost_program_选项,但链接器发现错误的库 < >我使用CGEL编译一个C++程序,使用的是代码> Boo::我已经通过运行CMake强制CMake找到正确的头和库,如下所示 cmake \ -DBOOST_ROOT:PATHNAME=/path/to/correct/boost/ \ -DBOOST_LIBRARYDIR=/path/to/correct/boost/lib/ \ -DBOOST_INCLUDEDIR=/path/to/correct/boost/include/ \ -DBoost_NO_BOOST_CMAKE=BOOL:ON \ .
CMake报告它找到了我希望它找到的CMake将显式Boost库路径转换为-lboost_program_选项,但链接器发现错误的库 < >我使用CGEL编译一个C++程序,使用的是代码> Boo::我已经通过运行CMake强制CMake找到正确的头和库,如下所示 cmake \ -DBOOST_ROOT:PATHNAME=/path/to/correct/boost/ \ -DBOOST_LIBRARYDIR=/path/to/correct/boost/lib/ \ -DBOOST_INCLUDEDIR=/path/to/correct/boost/include/ \ -DBoost_NO_BOOST_CMAKE=BOOL:ON \ .,boost,cmake,Boost,Cmake,CMake报告它找到了我希望它找到的boost库: -- Found the following Boost libraries: -- program_options -- Boost_INCLUDE_DIRS: /path/to/correct/boost/include -- Boost_LIBRARIES: /path/to/correct/boost/lib/libboost_program_options.so 然后我调用makeverbose=1-j 但是,CMake设置Ma
boost
库:
-- Found the following Boost libraries:
-- program_options
-- Boost_INCLUDE_DIRS: /path/to/correct/boost/include
-- Boost_LIBRARIES: /path/to/correct/boost/lib/libboost_program_options.so
然后我调用makeverbose=1-j
但是,CMake设置Makefile,以便
-L/path/to/correct/boost/lib/libboost_program_options.so
到gcc
,它通过
-lboost_program_options
链接器随后无法找到正确的库,因为它将。/lib64/
附加到目录:
attempt to open /path/to/correct/boost/lib/../lib64/libboost_program_options.so failed
gcc
然后尝试链接到错误版本的boost:
attempt to open /usr/lib/../lib64/libboost_program_options.so succeeded
-lboost_program_options (/usr/lib/../lib64/libboost_program_options.so)
这会导致未定义的引用
错误,正如错误的库版本所期望的那样
如何强制
gcc
使用CMake找到的确切库路径(Boost_库
)?是否有办法防止CMake将显式库路径转换为-lboost\u program\u选项
?或者,有没有办法让链接器在路径中使用lib/
而不是lib64/
来查找正确的目录?我遇到的问题与您使用Boost 1.65.1和CMake 3.9.3时遇到的问题完全相同。
但我很幸运,我有一个项目没有成功,另一个项目成功了,在同一台机器上使用相同的工具和库
不起作用的项目在顶级CMakeLists.txt的开头有这个
cmake_minimum_required(VERSION 3.0)
然而,好的项目已经成功了
cmake_minimum_required(VERSION 3.9.2)
这实际上改变了cmake的行为。什么版本的cmake和Boost?cmake 3.9.4和Boost 1.63.0。好的,你的cmake已经足够新了。你的
目标链接库是什么样子的?它应该类似于target\u link\u库(myTarget Boost::program\u options)
@oLen它看起来是这样的:target\u link\u库(target${Boost\u libraries})
。前面是find\u包(Boost必需组件程序选项)
和include\u目录(${Boost\u include\u DIRS})
。我已经验证了${Boost\u INCLUDE\u DIRS}
和${Boost\u库}
是正确的。