强制CMake使用完整的库路径

时间:2015-10-16 07:54:48

标签: linux linker cmake

我有以下问题。我的Linux机器上有一个单独的{bin,lib,include}树,其中安装了CMake和我开发工作所需的所有库。但只有PATH环境变量设置为此bin目录,并且由于某些原因我无法设置LD_LIBRARY_PATH。此树中的所有程序都是使用RPATH构建的。我正在使用的CMake 3.3.1也在这棵树里面。

现在问题我想使用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时,由于它与CMake位于相同的前缀内,因此找到了我的个人软件树中的curl和OpenSSL设置。

但是当我使用make VERBOSE=1构建项目时,我看到以下链接命令:

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

,构建可执行文件是指系统范围内安装的curl和openssl库,而不是配置期间找到的一个cmake。

如何强制CMake使用它在执行链接时找到的库?

1 个答案:

答案 0 :(得分:8)

将我的评论转化为答案

我能够重现您的问题 - 即使没有完全相同的环境 - 并找到了两种可能的解决方案:

  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

  3. <强>背景

    请检查CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES的设置,因为其中列出的路径被视为&#34;隐含&#34;相应地替换搜索路径和完整库路径(请参阅cmComputeLinkInformation::CheckImplicitDirItem()UnixPaths.cmake

    message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")