如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1相关的知识,希望对你有一定的参考价值。
我有一个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})
在CMakeLists.txt
中,LIBDIR_MY
指向dir3
,它在链接命令行中正确添加。但我发现没有添加.../devtoolset-3/...
的地方。
-L
的可能起源:
- 在
link_directories
的CMakeLists.txt
:检查。 target_link_libraries
:哪里?要查找的预期文件名模式是什么?link_libraries
:哪里?要查找的预期文件名模式是什么?CMAKE_LIBRARY_PATH
:检查。没有设定。- 一个
find_package
命令:见下文 - 别的地方?
这个How do I add a library path in cmake?不会增加我的问题。
更新1:
事实上,在find_package(mylib)
有一个CMakeLists.txt
(实际上,名字不同)。去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
(可能由find_package (PETSc REQUIRED)
中的CMakeLists.txt
线调用),它有一条线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的Update 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)
CMake/cmake-modules/FindPETSc.cmake
根据从文件(3)petsc_libs_external
读取的变量PETSC_EXTERNAL_LIB_BASIC
的值设置局部cmake变量~/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
。- 文件(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
将“不需要的”目录带入执行的命令行。
*1 (
petsc_get_variable
is a macro defined in FindPETSc.cmake
)
以上是关于如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1的主要内容,如果未能解决你的问题,请参考以下文章