CMake保持链接到/ usr / lib64下的库,甚至给出了到另一个库的完整路径

时间:2014-11-27 07:45:40

标签: linker cmake

我正在使用CMake(3.0.2)构建一个包。这个包依赖于boost_python和其他一些。 / usr / lib64中有一个旧版本,我在我自己的目录/home/x/opt/boost-1.56/lib中有另一个更新的版本。有一个符号链接/home/x/opt/boost-1.56/lib64来处理多拱gcc。

但是,即使我设置BOOST_ROOT=/home/x/opt/boost-1.56/lib,并且在CMakeCache.txt中也有

//Boost python library (release)
Boost_PYTHON_LIBRARY_RELEASE:FILEPATH=/home/x/opt/boost-1.56/lib/libboost_python.a

生成的link.txt包含这样一行,而不是完整路径:

-Wl,-Bstatic -lboost_python

make时,它链接到/ usr / lib64 /下的那个,这是错误的。

问题:

  1. 如何让CMake使用完整路径?正如文档所述,只有在系统默认文件夹下的库处理-Bstatic时才应该处理,这不应该是我的情况。
  2. 为什么-Wl,-Bstatic -lboost_python不起作用,即使LD_LIBRARY_PATHLIBRARY_PATH中有“/home/x/opt/boost-1.56/lib”?根据我的有限知识,他们应该覆盖系统默认值。
  3. 信息:

    gcc --print-search-dir给出:

    /home/x/opt/boost-1.56/lib/x86_64-unknown-linux-gnu/4.9.2/
    /home/x/opt/boost-1.56/lib/../lib64/
    /lib/x86_64-unknown-linux-gnu/4.9.2/
    /lib/../lib64/
    /usr/lib/x86_64-unknown-linux-gnu/4.9.2/
    /usr/lib/../lib64/
    /home/x/opt/boost-1.56/lib/
    /lib/
    /usr/lib/
    

3 个答案:

答案 0 :(得分:1)

set(Boost_NO_SYSTEM_PATHS ON)

这将允许它忽略除BOOST_ROOT

之外的所有内容

答案 1 :(得分:0)

解决方案(仅部分):

  • CMake使用-Bstatic,如果它认为它选择的boost库是在系统路径中,包括与环境变量相关的。否则它使用完整路径。
  • 我仍然无法找到为什么LIBRARY_PATH无法覆盖系统
  • 所以为了使它工作,删除LIBRARY_PATH和LD_LIBRARY_PATH中的所有内容都可以解决问题:在这种情况下,CMake将使用完整路径。

答案 2 :(得分:0)

在您的顶级CMakeLists.txt

的开头处添加此内容
cmake_minimum_required(VERSION 3.3)

并使用cmake 3.3.0或更高版本。

有趣的是,使用cmake 3.11.1 set(Boost_NO_SYSTEM_PATHS ON)对我来说不起作用。