我正在使用CMake编译使用boost::program_options
的C ++程序。我通过运行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报告它找到了我希望它找到的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
然后我致电make VERBOSE=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)
这会导致undefined reference
错误,正如人们对错误的库版本所期望的那样。
如何强制gcc
使用CMake找到的确切库路径(Boost_LIBRARIES
)?有没有办法阻止CMake将显式库路径转换为-lboost_program_options
?或者,有没有办法让链接器查看正确的目录,路径中的lib/
而不是lib64/
?
答案 0 :(得分:0)
我和Boost 1.65.1以及CMake 3.9.3的问题完全相同。 但我很幸运,我有一个项目没有工作,另一个项目在同一台机器上使用相同的工具和库。
没有工作的项目在顶级CMakeLists.txt的开头有这个
cmake_minimum_required(VERSION 3.0)
但是,好的项目有
cmake_minimum_required(VERSION 3.9.2)
这实际上改变了cmake的行为方式。