2015-10-16 3 views
4

У меня есть следующая проблема. У меня есть отдельное дерево {bin, lib, include} на моей машине Linux, где установлены CMake и все мои библиотеки, которые мне нужны для моей разработки. Но только переменная среды PATH установлена ​​в этот каталог bin и по нескольким причинам я не могу установить LD_LIBRARY_PATH. Все программы внутри этого дерева строятся с использованием RPATH. CMake 3.3.1, который я использую, также находится внутри этого дерева.Заставить CMake использовать полный путь библиотеки

Теперь проблема, я хочу, чтобы скомпилировать программу с помощью Libcurl и настроить следующие CMakeLists.txt

PROJECT(EXAMPLE) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
FIND_PACKAGE(CURL REQUIRED) 
FIND_PACKAGE(OpenSSL REQUIRED) 
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) 
SET(LIBS ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}) 

ADD_EXECUTABLE(curl_ex src/curl_ex.c) 
TARGET_LINK_LIBRARIES(curl_ex ${LIBS}) 

Когда я теперь запустить CMake завиток и установку OpenSSL из моего личного программного обеспечения дерева найден из-за к тому, что он находится внутри того же префикса, что и CMake.

Но когда я построить проект с использованием make VERBOSE=1 я вижу следующую связывающую команду:

gcc CMakeFiles/curl_ex.dir/src/curl_ex.c.o -o curl_ex -rdynamic -lcurl -lssl -lcrypto 

и сборки исполняемого файла относится к общесистемным установлен локон и OpenSSL библиотеки вместо одной CMake, найденных во время конфигурации ,

Как я могу заставить CMake использовать библиотеки, которые он нашел, когда он выполняет привязку?

+0

Это может быть связано с той же проблемой, описанной в политике ['CMP0060'] (https://cmake.org/cmake/help/v3.3/policy/CMP0060.html). В основном рекомендуется использовать [«ИМПОРТИРОВАННЫЕ цели библиотеки»] (https://cmake.org/cmake/help/v3.3/manual/cmake-buildsystem.7.html#imported-targets), где вы можете дать полные пути в 'IMPORTED_LOCATION' или вызвать' cmake_policy (SET CMP0060 NEW) '(поскольку по умолчанию это' OLD'). – Florian

+1

См. [CMake: TARGET_LINK_LIBRARIES с полными библиотеками путей] (https://cmake.org/pipermail/cmake/2014-September/058647.html). И если вы действительно хотите заставить его «target_link_libraries (curl_ex PRIVATE» -l $ ")' (см. [Здесь] (http://public.kitware.com/pipermail/cmake /2014-June/057767.html)). – Florian

ответ

6

Обращаясь мои комментарии в ответ

Я был в состоянии воспроизвести вашу проблему - даже не имея ту же самую среду - и нашел два возможных решения:

  1. Вы можете установить политику CMP0060 в NEW

    cmake_policy(SET CMP0060 NEW) 
    

    Новое поведение этой политики заключается в том, чтобы связать библиотеки по полному пути, даже если они находятся в неявных каталогах ссылок.

  2. Вы можете создать промежуточную импортируемую библиотеку и использовать IMPORTED_LOCATION (см [CMake] TARGET_LINK_LIBRARIES with full path libraries)

    add_library(curl UNKNOWN IMPORTED) 
    set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARIES}") 
    target_link_libraries(curl_ex curl) 
    

    Это работает для меня, но, по словам CMake imported library behaviour вам, возможно, потребуется также установить IMPORTED_IMPLIB.

фон

Пожалуйста, проверьте настройки CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES, так как пути, перечисленные в нем принимаются как «неявных» поиск путей и полные пути библиотеки заменяются соответствующим образом (см cmComputeLinkInformation::CheckImplicitDirItem() и UnixPaths.cmake)

message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") 
+0

Спасибо, CMP0060 объясняет, почему мои первые обходные пути работают только с новейшей версией CMake. –

Смежные вопросы