у меня есть 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
Команда: см. нижеэто Как добавить путь к библиотеке в 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
появиться здесь.Я нашел виновника.
Как указано в обновлении 1 OP, последовательность выглядит следующим образом:
find_package (PETSc REQUIRED)
в файле (1)CMakeLists.txt
файл принудительной обработки (2)CMake/cmake-modules/FindPETSc.cmake
,petsc_get_variable (PETSC_EXTERNAL_LIB_BASIC petsc_libs_external)
в файле (2)CMake/cmake-modules/FindPETSc.cmake
устанавливает локальную переменную cmakepetsc_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
приносит «нежелательные» каталоги в исполняемую командную строку.* 1 (petsc_get_variable
это макрос, определенный в FindPETSc.cmake
)
Других решений пока нет …