探討CMake中關於RPATH的使用


    最近研究CMake,發現CMake對於RPATH的管理也非常人性化。官方說法是當動態庫的編譯也和執行檔在同級目錄下的時候,CMake會自動給執行檔加入適當的RPATH.具體可以通過readelf -d executable來查看相關的RPATH路徑。所以有的時候用QMake編譯之后還得手動加一把LD_LIBRARY_PATH,而用CMake編譯之后,直接執行執行檔就可以了。

    相關RPATH的說明,同學可以自行google學習,簡單來說,RPATH就是在LD_LIBRARY_PATH之前,會優先讓執行檔去尋找相應的動態庫,當然了有的操作系統支持RUNPATH的話,會在RUNPATH設置情況下自動忽略RPATH,而會先去尋找LD_LIBRARY_PATH之后再去着RUNPATH,(注意這里面的順序關系,RUNPATH在LD_LIBRARY_PATH之后,而其會讓RPATH忽略,但RPATH卻在LD_LIBRARY_PATH之前),相關順序這里簡單交代下: RPATH   --   LD_LIBRARY_PATH -- RUNPATH(出現會屏蔽RPATH) -- /etc/ld.so.conf -- builtin dircetories(/lib, /usr/lib)。

    在這里我主要介紹下CMake對於RPATH的相關管控。默認行為已經在第一段說明了,那就是CMake在默認情況下是會給你的exe加入相關RPATH的,這個時候可能會有不想要相關RPATH的需求,仔細查閱尋找之后發現,CMake里面維護了3個比較重要的RPATH變量,即CMAKE_SKIP_RPATH,CMAKE_SKIP_BUILD_RPATH,CMKAE_INSTALL_RPATH.

    對於第一個變量CMAKE_SKIP_RPATH,簡單的來說,就是強制CMake不在構建期間和安裝install期間給你加上它所認為的RPATH.

cmake .. -DCMAKE_SKIP_RPATH=TRUE

   第二個和第三個變量也比較簡單,就是分別在構建期間和安裝期間不允許CMake給你加入相關RPATH

cmake .. -DCMAKE_SKIP_BUILD_RPATH=TRUE
cmake .. -DCMAKE_SKIP_INSTALL_RPATH=TRUE

當然了,如果你之后想要追加RPATH,只需要對這三個變量設置成FALSE就可以了。

 

參考鏈接: www.cmake.org/Wiki/CMake_RPATH_handling#No_RPATH_at_all


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM