2015-10-16 76 views
4

我有以下問題。我在我的Linux機器上有一個獨立的{bin,lib,include}樹,其中安裝了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}) 

當我現在運行C進行卷曲和OpenSSL的設置我的個人軟件樹的發現,由於事實上,它駐留在與CMake相同的前綴內。

但是當我建立使用make VERBOSE=1我看到下面的鏈接命令的項目:

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

和構建可執行文件指的是全系統的安裝捲曲和OpenSSL庫,而不是一個C進行配置過程中發現。

如何強制CMake使用它在執行鏈接時找到的庫?

+0

這可能與策略['CMP0060'](https://cmake.org/cmake/help/v3.3/policy/CMP0060.html)中描述的相同問題有關。它主要建議使用[「IMPORTED庫目標」](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 $ 」)'(參見[here](http://public.kitware.com/pipermail/cmake) /2014-June/057767.html))。 – Florian

回答

6

談到我的意見爲答案

我能夠重現你的問題 - 即使沒有完全相同的環境 - 並發現了兩個可能的解決方案:

  1. 您制定政策CMP0060NEW

    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版本。 –