CMake将显式Boost库路径转换为-lboost_program_options,但链接器发现错误的库

时间:2017-12-15 20:07:42

标签: boost cmake

我正在使用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/

1 个答案:

答案 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的行为方式。