再談CMake與RPATH

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   檔案   問題   

   之前寫過一篇<探討CMake中關於RPATH的使用>,只要針對的方面是在編譯產生之後(不包括安裝的make install)如何去除RPATH的問題。今天給大家主要介紹一下如何讓CMake在用install命令之後如何保持RPATH。

   我先來簡單介紹下CMake關於RPATH的機制,在之前文章中介紹過,如果你沒有顯示指定CMAKE_SKIP_RPATH,CMAKE_BUILD_WITH_INSTALL_RPATH,CMAKE_SKIP_BUILD_RAPTH,CMAKE_SKIP_INSTALL_RPATH的話,預設CMake在幫你編譯之後,如果你使用了相關動態庫,它會在相應的executable中增加你相關產生動態庫的路徑,這樣當你每次去執行的時候你不需要每次都LD_LIBRARY_PATH就可以正常運行。這個時候你可以用一下

readelf -d myexe

你可以看到,當前myexe中的RPATH欄位有一個Library rpath,其中指定了你產生相應動態庫target的目標路徑。當然你也可以通過

ldd -r myexe

來查看當前executable已經尋找到了哪些動態庫。當然你可以因此做一個小實驗,就是移動相關shared_lib庫的路徑,這個時候你再去運行myexe,你就會發現它已經找不到相關的動態庫了,因為目前的RPATH都是寫的絕對路徑,所以如果你只是移動exe而不是lib,則沒有任何問題。

    再來說一下make install下CMake是如何處理RPATH的。CMake為了方便使用者的安裝,預設在make install之後會自動remove刪除掉相關的RPATH,這個時候你再去查看exe的RPATH,已經發現沒有這個欄位了。因此,當每次make install之後,我們進入到安裝路徑下執行相關exe的時候,就會發現此時的exe已經找不到相關的庫路徑了,因為它的RPATH已經被CMake給去除了。

    那麼,如何讓CMake能夠在install的過程中寫入相關RPATH並且該RPATH不能使當初build的時候的RPATH呢?答案就是CMAKE_INSTALL_RPATH這個全域變數和INSTALL_RPATH這個target屬性。下面舉一下簡單的例子。

    大家都知道,CMake在安裝的過程會有一個和configure一樣的安裝路徑,CMAKE_INSTALL_PREFIX(configure下是--prefix,當然也可以用shell下的全域變數DESTDIR),這個時候它會把你的安裝檔案安裝到你prefix下的相對路徑下,因此當我們希望在make install的時候,比如當前的share_lib在lib目錄下,我們希望安裝之後的RPATH可以自動找到它,我們就可以這麼寫

set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib)

需要注意的是,這個變數是全域變數,意味著你所有的target的RPATH都會在install的時候被寫成這個(包括myexe和不需要RPATH的share_lib),有沒有簡單的針對某個target呢,聰明的你應該已經想到了

set_target_properties(myexe PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

這樣就可以保證只針對當前的target進行make install的時候RPATH的寫入了。

    以上就是對前面一篇CMake與RPATH的補充,希望你會喜歡 : )

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.