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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1相关的知识,希望对你有一定的参考价值。

我有一个CMakeLists.txt。我用它来生成makefileccmake。然后在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的可能起源:

  1. link_directoriesCMakeLists.txt:检查。
  2. target_link_libraries:哪里?要查找的预期文件名模式是什么?
  3. link_libraries:哪里?要查找的预期文件名模式是什么?
  4. CMAKE_LIBRARY_PATH:检查。没有设定。
  5. 一个find_package命令:见下文
  6. 别的地方?

这个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 {} ;有两个匹配的文件:

  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(可能由find_package (PETSc REQUIRED)中的CMakeLists.txt线调用),它有一条线 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的Update 1中所暗示的那样,顺序如下:

  1. find_package (PETSc REQUIRED)文件(1)CMakeLists.txt强制处理文件(2)CMake/cmake-modules/FindPETSc.cmake
  2. 文件(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
  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将“不需要的”目录带入执行的命令行。


*1 (petsc_get_variable is a macro defined in FindPETSc.cmake)

以上是关于如何在由cmake生成的链接命令行中用-Ldir2替换给定的-Ldir1的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 CMake 链接到系统库而不是同名目标

如何捕获 CMake 命令行参数?

cmake 在Windows 命令行怎么指定编译器

CMake基础教程(30)CMake构建系统概览

CMake基础教程(30)CMake构建系统概览

为 cmake 指定库以从命令行链接到