2016-10-20 459 views
5

如何在MacOS上的CMake中的目標上設置多個RPATH目錄?在Linux中,我們可以只使用一個冒號分隔的列表:如何在MacOS上使用CMake設置多個RPATH目錄

set_target_properties(mytarget 
    PROPERTIES 
    INSTALL_RPATH "\$ORIGIN/../lib:\$ORIGIN/../thirdparty/lib" 
) 

在MacOS上,我們可以在技術上加冒號分隔列表和otool -l應該表現出來,但這些目錄不搜索:

set_target_properties(mytarget 
    PROPERTIES 
    INSTALL_RPATH "@loader_path/../lib:@loader_path/../thirdparty/lib" 
) 

通常,如果我要在MacOS上有多個RPATH目錄,我會發送多個鏈接器標記,並且這些標記將分別顯示爲otool -l。喜歡的東西:

g++-mp-4.7 mytarget.cpp -o mytarget -Wl,-rpath,@loader_path/../lib,-rpath,@loader_path/../thirdparty/lib 

其中給出:

Load command 15 
      cmd LC_RPATH 
     cmdsize 32 
     path @loader_path/../lib (offset 12) 
Load command 16 
      cmd LC_RPATH 
     cmdsize 48 
     path @loader_path/../thirdparty/lib (offset 12) 

如何重建與CMake的這種行爲?

回答

7

按照documentation,路徑不應該用冒號分隔,但分號

set_target_properties(mytarget 
    PROPERTIES 
    INSTALL_RPATH "@loader_path/../lib;@loader_path/../thirdparty/lib" 
) 

或者使用命令set讓CMake的交易與分離器:

set(MY_INSTALL_RPATH 
    "@loader_path/../lib" 
    "@loader_path/../thirdparty/lib" 
) 
set_target_properties(mytarget 
    PROPERTIES 
    INSTALL_RPATH "${MY_INSTALL_RPATH}" 
) 

編輯:(感謝Tsyvarev的評論)

或者,使用命令set_property,它接受多值屬性:它接受多值屬性

set_property(
    TARGET mytarget 
    PROPERTY INSTALL_RPATH 
    "@loader_path/../lib" 
    "@loader_path/../thirdparty/lib" 
) 
+1

..或使用'set_property(TARGET)'。 – Tsyvarev

+0

@wasthishelpful像魅力一樣工作。謝謝! – wyer33