如何在 cmake 生成的链接命令行中用 -Ldir2 替换给定的 -Ldir1
How can I replace a given -Ldir1 by -Ldir2, in a linking command line generated by cmake
我有一个CMakeLists.txt
。
我用它来生成 makefile
和 ccmake
。
然后在 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
的可能来源:
link_directories
在 CMakeLists.txt
中:选中。
target_link_libraries
:在哪里?要查找的预期文件名模式是什么?
link_libraries
:在哪里?要查找的预期文件名模式是什么?
CMAKE_LIBRARY_PATH
:选中。未设置。
- 一个
find_package
命令:见下文
- 其他地方?
这个 没有添加到我的问题中。
更新 1:
在CMakeLists.txt
中实际上有一个find_package(mylib)
(实际上是不同的名字)。
转到 mylib
的目录并发出 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
(可能由 CMakeLists.txt
中的行 find_package (PETSc REQUIRED)
调用),其中有一行
set (PETSC_LIBRARIES ${PETSC_LIBRARIES_ALL} CACHE STRING "PETSc libraries" FORCE)
和许多先前的行
set (PETSC_LIBRARIES_<various terms> ...)
备注:
我不知道 devtoolset-3
文件中的哪个位置首先被检测到并设置。
build/include/summit/mylibConfig.cmake
。
我仍然无法找到 devtoolset-3
出现在这里的原因。
我找到了罪魁祸首。
正如 OP 的更新 1 中所暗示的那样,顺序如下:
- 行
find_package (PETSc REQUIRED)
在文件 (1) 中
CMakeLists.txt
强制处理文件(2)
CMake/cmake-modules/FindPETSc.cmake
.
- 行*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
.
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
.
- 行
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" 目录带入执行的命令行。
*1(petsc_get_variable
是FindPETSc.cmake
中定义的宏)
我有一个CMakeLists.txt
。
我用它来生成 makefile
和 ccmake
。
然后在 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
的可能来源:
link_directories
在CMakeLists.txt
中:选中。target_link_libraries
:在哪里?要查找的预期文件名模式是什么?link_libraries
:在哪里?要查找的预期文件名模式是什么?CMAKE_LIBRARY_PATH
:选中。未设置。- 一个
find_package
命令:见下文 - 其他地方?
这个
更新 1:
在CMakeLists.txt
中实际上有一个find_package(mylib)
(实际上是不同的名字)。
转到 mylib
的目录并发出 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
(可能由CMakeLists.txt
中的行find_package (PETSc REQUIRED)
调用),其中有一行set (PETSC_LIBRARIES ${PETSC_LIBRARIES_ALL} CACHE STRING "PETSc libraries" FORCE)
和许多先前的行
set (PETSC_LIBRARIES_<various terms> ...)
备注:
我不知道 devtoolset-3
文件中的哪个位置首先被检测到并设置。
build/include/summit/mylibConfig.cmake
。 我仍然无法找到devtoolset-3
出现在这里的原因。
我找到了罪魁祸首。 正如 OP 的更新 1 中所暗示的那样,顺序如下:
- 行
find_package (PETSc REQUIRED)
在文件 (1) 中CMakeLists.txt
强制处理文件(2)CMake/cmake-modules/FindPETSc.cmake
. - 行*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
. 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
.- 行
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" 目录带入执行的命令行。
*1(
petsc_get_variable
是FindPETSc.cmake
中定义的宏)