Как я могу заменить данный -Ldir1 на -Ldir2 в командной строке компоновки, сгенерированной cmake

У меня есть 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:

  1. link_directories в CMakeLists.txt: проверено.
  2. target_link_libraries: Куда? Каков ожидаемый шаблон имени файла для поиска?
  3. link_libraries: Куда? Каков ожидаемый шаблон имени файла для поиска?
  4. CMAKE_LIBRARY_PATH: Проверено. Это не установлено.
  5. find_package Команда: см. ниже
  6. Где-нибудь еще?

Это Как мне добавить путь к библиотеке в 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 появиться здесь.

1 ответ

Я нашел виновника. Как указано в обновлении 1 OP, последовательность выглядит следующим образом:

  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) в файле (2) CMake/cmake-modules/FindPETSc.cmake устанавливает локальную переменную cmake petsc_libs_external от значения переменной PETSC_EXTERNAL_LIB_BASIC читать из файла (3) ~/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. Линия 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)

Другие вопросы по тегам