CMAKE和RPATH

原文鏈接:https://blog.csdn.net/guo1988kui/article/details/81037366

什麼是RPATH?

在Linux環境下,使用動態鏈接的程序在運行時會自動鏈接 ld.so 這個庫(OS X上是 dyld),然後通過 ld.so 來查找鏈接其它的庫。而 RPATH 就是編譯的時候鏈接到執行文件的鏈接庫路徑。OS X在 RPATH 的設置上和Linux還是有點出入的,OS X的 RPATH 採用的是絕對路徑。

ld.so 搜索路徑的優先級是這樣的:

1. RPATH ,編譯鏈接時加入 -rpath 參數指明所謂的 RUNPATH ,這樣可執行文件(或者依賴其他動態鏈接庫的動態鏈接庫)就能告訴 ld.so 到哪裏去搜索對應的動態鏈接庫了。

2. LD_LIBRARY_PATH ,對於沒有設定 RPATH 的可執行文件或者動態鏈接庫,我們可以用 LD_LIBRARY_PATH 這個環境變量通知 ld.so 往哪裏查找鏈接庫。

3. /etc/ld.so.conf ,系統對 ld.so 的路徑配置文件。

4. /usr/lib 、 /lib 和 /usr/local/lib ,系統默認路徑。

Cmake和RPATH

在分發程序的時候,執行文件使用的鏈接庫在系統內不一定會有,或者自帶了的版本不對,一般都會在程序文件夾內都會附帶相應的鏈接庫,所以最好還是把 RPATH 加上。Cmake對RPATH提供了很多選項支持,我們一般只關注這幾個變量就好了: CMAKE_SKIP_BUILD_RPATH 、 CMAKE_BUILD_WITH_INSTALL_RPATH 、 CMAKE_INSTALL_RPATH 和 CMAKE_INSTALL_RPATH_USE_LINK_PATH 。

默認RPATH設置

    set(CMAKE_SKIP_BUILD_RPATH FALSE) # 編譯時加上RPATH
    set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # 編譯時RPATH不使用安裝的RPATH
    set(CMAKE_INSTALL_RPATH "") # 安裝RPATH爲空
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) # 安裝的執行文件不加上RPATH 

Cmake在默認情況下, make install 會把安裝的執行文件的 RPATH 刪掉的,所以就會出現上面我執行安裝好的執行文件報錯的問題。

加上完整的RPATH

Cmake的默認設置我們肯定是不能使用的,我們需要一個安裝的時候也要帶上 RPATH 的設置。

    set(INSTALL_LIB_DIR "${PROJECT_BINARY_DIR}/lib") # 假設安裝目錄在編譯目錄的lib子目錄內
    set(CMAKE_SKIP_BUILD_RPATH FALSE)
    set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
    set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    # 確保鏈接庫不在系統默認安裝的目錄上時更改到項目lib上
    list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_RPATH} isSystemDir)
    if("${isSystemDir}" STREQUAL "-1")
    set(CMAKE_INSTALL_RPATH "${INSTALL_LIB_DIR}")
    endif("${isSystemDir}" STREQUAL "-1") 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章