为简单起见,这是我想要实现的一个例子:
的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)