如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1

时间:2018-02-27 21:25:44

标签: c++ cmake software-collections

我有CMakeLists.txt。 我用它来生成makefile ccmake。 然后在make,我的源编译好了。 在链接时,生成的命令行基本上是

/opt/rh/devtoolset-6/root/usr/bin/c++ myprog.cc.o -o myprog -Ldir3 -L/opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2 ... -Wl,-rpath,dir4:dir5:/opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2 ...

指定搜索路径的两个点

/opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2

实际应指向

/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.2.1

我该如何解决这个问题?

我的系统中有devtoolset-3,但我不知道此搜索路径的设置位置或更改方式。 我实际上希望在执行

后自动进行
scl-devtoolset-6

(在我的.bashrc中),与检测到正确版本/opt/rh/devtoolset-6/root/usr/bin/c++的方式相同,而我没有做任何其他事情。

当然,由于版本不匹配,我收到很多链接时间错误。

我看到搜索路径设置的唯一位置是

link_directories(${LIBDIR_MY})
<{1>}中的

CMakeLists.txt指向LIBDIR_MY,它在链接命令行中正确添加。 但我找不到添加dir3的地方。

.../devtoolset-3/...的可能来源:

    {li} -L link_directories:已检查。
  1. CMakeLists.txt:在哪里?要查找的预期文件名模式是什么?
  2. target_link_libraries:在哪里?要查找的预期文件名模式是什么?
  3. link_libraries:已检查过。它没有设置。
  4. CMAKE_LIBRARY_PATH命令:见下文
  5. 其他地方?
  6. How do I add a library path in cmake?不会添加到我的问题中。

    更新1

    find_package实际上有一个find_package(mylib)(实际上,名称不同)。 转到CMakeLists.txt的目录并发出mylib,有两个匹配的文件:

    1. find . -name “*” -type f -exec grep /opt/rh/devtoolset-3 {} \;: 两次出现build/CMakeCache.txt

      devtoolset-3

      在我看来,这源于文件PETSC_LIBRARIES:STRING=...devtoolset-3... FIND_PACKAGE_MESSAGE_DETAILS_PETSc:INTERNAL=[...devtoolset-3...][YES][v()] (可能由CMake/cmake-modules/FindPETSc.cmake中的行find_package (PETSc REQUIRED)调用),其中有一行

      CMakeLists.txt

      和许多先前的行

      set (PETSC_LIBRARIES ${PETSC_LIBRARIES_ALL} CACHE STRING "PETSc libraries" FORCE)
      
    2. 注意: 我不知道首先检测并设置该文件set (PETSC_LIBRARIES_<various terms> ...) 中的哪个位置。

      1. devtoolset-3。 我仍无法追踪build/include/summit/mylibConfig.cmake在此处显示的内容。

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首。 正如OP的Update 1中所暗示的那样,顺序如下:

  1. 线 文件(1)中的find_package (PETSc REQUIRED) CMakeLists.txt强制处理文件(2) CMake/cmake-modules/FindPETSc.cmake
  2. * 1 文件(2)中的petsc_get_variable (PETSC_EXTERNAL_LIB_BASIC petsc_libs_external) CMake/cmake-modules/FindPETSc.cmake设置本地cmake变量 来自变量值的petsc_libs_external PETSC_EXTERNAL_LIB_BASIC从文件中读取(3) ~/petsc-3.8.2/lib/petsc/conf/petscvariables
  3. PETSC_EXTERNAL_LIB_BASIC未在文件(3)中明确设置 ~/petsc-3.8.2/lib/petsc/conf/petscvariables。线 include ~/petsc-3.8.2/arch-linux2-c-debug/lib/petsc/conf/petscvariables强制阅读文件(4) ~/petsc-3.8.2/arch-linux2-c-debug/lib/petsc/conf/petscvariables
  4. 线 文件(4)中的PETSC_EXTERNAL_LIB_BASIC = ... -Wl,-rpath,/opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -Wl,-rpath,/opt/rh/devtoolset-3/root/usr/lib64 -L/opt/rh/devtoolset-3/root/usr/lib64 -Wl,-rpath,/opt/rh/devtoolset-3/root/usr/lib -L/opt/rh/devtoolset-3/root/usr/lib ... /home/sserebrinsky/petsc-3.8.2/arch-linux2-c-debug/lib/petsc/conf/petscvariables带来了#34;不受欢迎的&#34;目录进入执行的命令行。
  5. <小时/> * 1 petsc_get_variableFindPETSc.cmake中定义的宏)