我有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/...
的可能来源:
-L
link_directories
:已检查。
CMakeLists.txt
:在哪里?要查找的预期文件名模式是什么?target_link_libraries
:在哪里?要查找的预期文件名模式是什么?link_libraries
:已检查过。它没有设置。CMAKE_LIBRARY_PATH
命令:见下文此How do I add a library path in cmake?不会添加到我的问题中。
更新1 :
find_package
实际上有一个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
在此处显示的内容。答案 0 :(得分:0)
我找到了罪魁祸首。 正如OP的Update 1中所暗示的那样,顺序如下:
find_package (PETSc REQUIRED)
CMakeLists.txt
强制处理文件(2)
CMake/cmake-modules/FindPETSc.cmake
。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
。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 ...
/home/sserebrinsky/petsc-3.8.2/arch-linux2-c-debug/lib/petsc/conf/petscvariables
带来了#34;不受欢迎的&#34;目录进入执行的命令行。<小时/> * 1 (
petsc_get_variable
是FindPETSc.cmake
中定义的宏)