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

How can I replace a given -Ldir1 by -Ldir2, in a linking command line generated by cmake

我有一个CMakeLists.txt。 我用它来生成 makefileccmake。 然后在 make 时,我的源代码编译正常。 在link时,产生的命令行本质上是

/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++ 而我没有做任何其他事情。

当然,由于版本不匹配,我遇到很多 linking 时间错误。

我唯一看到设置搜索路径的地方是行

link_directories(${LIBDIR_MY})

CMakeLists.txt中,LIBDIR_MY指向dir3,在linking命令行中正确添加。 但是我发现没有添加.../devtoolset-3/...的地方。

-L的可能来源:

  1. link_directoriesCMakeLists.txt 中:选中。
  2. target_link_libraries:在哪里?要查找的预期文件名模式是什么?
  3. link_libraries:在哪里?要查找的预期文件名模式是什么?
  4. CMAKE_LIBRARY_PATH:选中。未设置。
  5. 一个find_package命令:见下文
  6. 其他地方?

这个 没有添加到我的问题中。


更新 1:

CMakeLists.txt中实际上有一个find_package(mylib)(实际上是不同的名字)。 转到 mylib 的目录并发出 find . -name “*” -type f -exec grep /opt/rh/devtoolset-3 {} \; 有两个匹配的文件:

  1. 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(可能由 CMakeLists.txt 中的行 find_package (PETSc REQUIRED) 调用),其中有一行

    set (PETSC_LIBRARIES ${PETSC_LIBRARIES_ALL} CACHE STRING "PETSc libraries" FORCE)
    

    和许多先前的行

    set (PETSC_LIBRARIES_<various terms> ...)
    

备注: 我不知道 devtoolset-3 文件中的哪个位置首先被检测到并设置。

  1. build/include/summit/mylibConfig.cmake。 我仍然无法找到 devtoolset-3 出现在这里的原因。

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

  1. find_package (PETSc REQUIRED) 在文件 (1) 中 CMakeLists.txt强制处理文件(2) CMake/cmake-modules/FindPETSc.cmake.
  2. *1 petsc_get_variable (PETSC_EXTERNAL_LIB_BASIC petsc_libs_external) 在文件 (2) 中 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. 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 ... 在文件 (4) 中 /home/sserebrinsky/petsc-3.8.2/arch-linux2-c-debug/lib/petsc/conf/petscvariables 将 "undesired" 目录带入执行的命令行。


*1petsc_get_variableFindPETSc.cmake中定义的宏)