Linux 强制CMake使用完整库路径

Linux 强制CMake使用完整库路径,linux,linker,cmake,Linux,Linker,Cmake,我有以下问题。我在我的Linux机器上有一个独立的{bin,lib,include}树,在那里安装了CMake和我开发工作所需的所有库。但是只有PATH环境变量被设置为这个bin目录,并且由于一些原因,我不能设置LD_LIBRARY_路径。此树中的所有程序都是使用RPATH生成的。我正在使用的CMake 3.3.1也在这棵树中 现在,我想用libcurl编译一个程序,并设置以下CMakeLists.txt PROJECT(EXAMPLE) CMAKE_MINIMUM_REQUIRED(VERSI

我有以下问题。我在我的Linux机器上有一个独立的{bin,lib,include}树,在那里安装了CMake和我开发工作所需的所有库。但是只有PATH环境变量被设置为这个bin目录,并且由于一些原因,我不能设置LD_LIBRARY_路径。此树中的所有程序都是使用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时,会发现curl和我的个人软件树中的OpenSSL设置,因为它与CMake位于同一前缀中

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

gcc CMakeFiles/curl_ex.dir/src/curl_ex.c.o  -o curl_ex -rdynamic -lcurl -lssl -lcrypto 
构建可执行文件指的是系统范围内安装的curl和openssl库,而不是在配置过程中找到的cmake库

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

把我的评论变成答案

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

  • 您将策略设置为“新建”

    cmake_policy(SET CMP0060 NEW)
    
    此策略的新行为是按完整路径链接库,即使它们位于隐式链接目录中

  • 您可以创建一个中间导入库并使用
    imported\u LOCATION
    (请参阅)

    这对我很有效,但根据您的要求,您可能还需要设置
    IMPLIB

  • 背景

    请检查
    CMAKE\u PLATFORM\u IMPLICIT\u LINK\u目录的设置
    ,因为其中列出的路径被视为“隐式”搜索路径,而完整的库路径被相应地替换(请参阅和)


    这可能与策略中描述的相同问题有关。它主要建议使用在
    导入的\u位置中提供完整路径的位置
    ,或者调用
    cmake\u策略(设置CMP0060 NEW)
    (因为默认值是
    旧的
    )。请参阅。如果你真的想强制它
    target\u link\u库(curl\u ex PRIVATE“-l$”
    (请参阅)。谢谢,CMP0060解释了为什么我的第一个解决方案只适用于最新的CMake版本。
    add_library(curl UNKNOWN IMPORTED)
    set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARIES}")
    target_link_libraries(curl_ex curl)
    
    message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")