2015-09-25 65 views
0

我試圖設置一個項目,我的存儲庫將所有依賴項作爲git子模塊導入,以便於開發。我的同事可以簡單地克隆回購,git submodule update --init --recursive,cmake .make,並有一個完全有效的開發環境。目錄結構設置爲在頂層有CMakeLists.txt一個superbuild是建立使用ExternalProject_Add的所有子模塊,導致結構如下:爲外部項目設置RPATH?

root 
- CMakeLists.txt (superbuild) 
- git_submodule_1 
- git_submodule_2 
- usr 
    - lib 
    - include 
- my_project 
    - CMakeLists.txt (project) 

CMakeLists.txt看起來是這樣的:

SET (INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/usr) 

# Install git_submodule_1 with ${INSTALL_PREFIX} as a prefix 
ExternalProject_Add(...) 

# Install git_submodule_2 with ${INSTALL_PREFIX} as a prefix 
ExternalProject_Add(...) 

ExternalProject_Add(
    MyProject 
    PREFIX ${CMAKE_SOURCE_DIR}/my_project 
    DEPENDS ExternalProject_git_submodule_1 ExternalProject_git_submodule_2 

    SOURCE_DIR ${CMAKE_SOURCE_DIR}/my_project 
    CMAKE_ARGS 
     -DCMAKE_LIBRARY_PATH:string=${INSTALL_PREFIX}/lib 
     -DCMAKE_PROGRAM_PATH:string=${INSTALL_PREFIX}/bin 
     -DCMAKE_INCLUDE_PATH:string=${INSTALL_PREFIX}/include 

    # etc, nothing nonstandard here 
) 

構建過程很好。我在make的頂層,依賴關係被安裝到usr,我cdmy_project,我做了我的工作,所有建好的共享庫都找到並鏈接了,我很高興。

但是,當我在my_project內部構建的OS X上運行可執行文件時,我發現無法找到放置在usr/lib目錄中的動態庫。看起來CMake只設置了在項目目錄內建立的庫RPATH,其在這種情況下僅僅是my_project

有沒有什麼辦法可以將定製安裝位置添加到RPATH的構建時庫和可執行文件?

的幾個注意事項:

  • 這個問題似乎隻影響OS X.的Linux根本不會出現這些問題。
  • 設置DYLD_LIBRARY_PATH以包含自定義安裝位置。但是,這增加了設置的額外步驟,並且在嘗試調試安裝問題時會變得煩人。
  • 設置DYLD_FALLBACK_LIBRARY_PATH也可以,雖然這也不是一個好的選擇,因爲它也增加了一個額外的設置,並且自制軟件用戶不會喜歡這個選項。

回答

1

對於可執行文件,並與my_project/CMakeLists.txt內置共享庫添加${INSTALL_PREFIX}/lib到安裝rpath的,也使CMake的鏈接目標在構建樹,在下面的方式安裝的是rpath:

set_target_properties(my_exe PROPERTIES INSTALL_RPATH "${INSTALL_PREFIX}/lib") 
set_target_properties(my_exe PROPERTIES BUILD_WITH_INSTALL_RPATH ON) 

這樣加載程序應該在構建樹中運行可執行文件時找到安裝到${CMAKE_SOURCE_DIR}/usr/lib目錄的外部庫。

+0

這不會有這樣的缺點,寧願自定義庫超過系統的?我試圖設計這個項目來爲開發提供所需的庫,然後在安裝完成後完全依賴於它們。 – Alex