强制CMake使用完整的库path

我有以下问题。 我在我的Linux机器上有一个独立的{bin,lib,include}树,其中CMake和我的开发工作所需的所有库都被安装。 但是只有PATH环境variables被设置为这个bin目录,由于几个原因我不能设置LD_LIBRARY_PATH。 该树内的所有程序都是使用RPATH构build的。 我用的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来构build项目时,我看到下面的链接命令:

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

而构build可执行文件是指系统范围内安装的curl和openssl库,而不是在configuration期间find的一个cmake库。

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

把我的意见转换成答案

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

  1. 您将策略CMP0060设置为NEW

     cmake_policy(SET CMP0060 NEW) 

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

  2. 您可以创建一个中间导入的库并使用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}")