小编典典

强制CMake使用完整的库路径

linux

我有以下问题。我的Linux机器上有一棵单独的{bin,lib,include}树,安装了我的开发工作所需的CMake和所有库。但是只有PATH环境变量被设置到该bin目录,由于某些原因,我无法设置LD_LIBRARY_PATH。该树中的所有程序都是使用RPATH构建的。我正在使用的CMake3.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

而build可执行文件是指在系统范围内安装的curl和openssl库,而不是在配置过程中发现的一个cmake。

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


阅读 1037

收藏
2020-06-07

共1个答案

小编典典

把我的评论变成答案

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

  1. 您将政策设置CMP0060NEW
    cmake_policy(SET CMP0060 NEW)
    

此策略的新行为是按完整路径链接库,即使它们位于隐式链接目录中也是如此。

  1. 您可以创建一个中间导入的库并使用IMPORTED_LOCATION(请参阅[CMake] TARGET_LINK_LIBRARIES和完整路径库
    add_library(curl UNKNOWN IMPORTED)
    

    set_property(TARGET curl PROPERTY IMPORTED_LOCATION “${CURL_LIBRARIES}”)
    target_link_libraries(curl_ex curl)

这对我有用,但是根据CMake导入的库行为,您可能还需要设置IMPORTED_IMPLIB

背景

请检查的设置,CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES因为此处列出的路径被视为“隐式”搜索路径,并且完整的库路径也已相应替换(请参见cmComputeLinkInformation::CheckImplicitDirItem()UnixPaths.cmake)。

message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
2020-06-07