CMake使用链接库的rpath而不是完整路径

时间:2018-05-01 17:58:19

标签: c++ macos cmake dynamic-linking rpath

为简单起见,这是我想要实现的一个例子:

的CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(example)

add_library(${PROJECT_NAME} SHARED)
target_link_libraries(${PROJECT_NAME} PUBLIC objc)
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)

构建之后,我运行以下命令:
otool -L libexample.dylib输出:

libexample.dylib:
    @rpath/libexample.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)

是否有任何可以通过CMake完成导致链接到objc库使用rpath而不是完整路径? @rpath/libobjc.A.dylib代替/usr/lib/libobjc.A.dylib

编辑:
我已尝试过此question的解决方案,但它似乎无法解决我的问题。 otool命令的输出保持不变。

编辑2:
以下示例仍链接到完整路径而不是rpath:

cmake_minimum_required(VERSION 3.9)
project(example)

set(CMAKE_MACOSX_RPATH TRUE)
set(CMAKE_SKIP_BUILD_RPATH  FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_NAME_DIR "@rpath/")

add_library(${PROJECT_NAME} SHARED)

set_target_properties(${PROJECT_NAME} PROPERTIES
        LINKER_LANGUAGE CXX
        LINK_FLAGS "-Wl,-rpath,./"
        MACOSX_RPATH TRUE
        SKIP_BUILD_RPATH FALSE
        BUILD_WITH_INSTALL_RPATH TRUE
        INSTALL_RPATH_USE_LINK_PATH TRUE
        INSTALL_NAME_DIR "@rpath/")

target_link_libraries(${PROJECT_NAME} PUBLIC objc)

编辑3:

经过进一步调查,我得出的结论是,如果不使用install_name_tool -change,这是不可能的。从这个issue看来,对于任何外部库(在构建树之外),生成的链接路径将是库的id(使用:otool -D /usr/lib/libobjc.A.dylib来查找lib的id)

0 个答案:

没有答案