强制 CMake 使用完整的库路径
Force CMake to use the full library path
我有以下问题。我的 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 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 在执行链接时使用它找到的库?
将我的评论变成答案
我能够重现您的问题 - 即使没有完全相同的环境 - 并找到了两个可能的解决方案:
您将策略 CMP0060
设置为 NEW
cmake_policy(SET CMP0060 NEW)
The NEW behavior for this policy is to link libraries by full path even if they are in implicit link directories.
您可以创建中间导入库并使用 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
的设置,因为那里列出的路径被视为 "implicit" 搜索路径,并且完整的库路径被相应地替换(参见 cmComputeLinkInformation::CheckImplicitDirItem()
and UnixPaths.cmake
)
message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
我有以下问题。我的 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 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 在执行链接时使用它找到的库?
将我的评论变成答案
我能够重现您的问题 - 即使没有完全相同的环境 - 并找到了两个可能的解决方案:
您将策略
CMP0060
设置为NEW
cmake_policy(SET CMP0060 NEW)
The NEW behavior for this policy is to link libraries by full path even if they are in implicit link directories.
您可以创建中间导入库并使用
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
的设置,因为那里列出的路径被视为 "implicit" 搜索路径,并且完整的库路径被相应地替换(参见 cmComputeLinkInformation::CheckImplicitDirItem()
and UnixPaths.cmake
)
message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")