最近研究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