2015-12-02 33 views
9

而不是給-Wl,-rpath=$HOME/local/gcc52/lib64到GCC 5.2每次調用這是我從源代碼構建,我修改了其spec文件中這樣說:GCC specs文件:如何讓安裝路徑

*link_command: 
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) -rpath=%:getenv(HOME /local/gcc52/lib64) ... 

但這取決於我在$HOME/local/gcc52下的具體安裝。有沒有更好的方法來引用被調用的GCC本身的安裝路徑?

本手冊頁並沒有幫助我很多:

+1

有時需要'-L'和'-Wl,-rpath'。所以我想更廣泛的問題是:在本地安裝編譯器之後,我們如何讓這一臺機器上的所有內容「只是工作」,忽略系統庫/頭文件? –

+0

您是否試過使用規格文件? – fhossfel

+0

https://stackoverflow.com/a/17224826提供了一個解決方案,用於在安裝GCC之後創建具有正確路徑的spec文件。如果稍後移動GCC安裝,則需要重新創建spec文件。 –

回答

2

據我所知,GCC是很大程度上取決於它被編譯爲安裝文件夾。我非常頻繁地構建RTEMS交叉編譯工具鏈,並且我學到的第一件事情之一是在生成的交叉編譯器中有多個位置,其中安裝前綴(即任何被傳遞給--exec-prefix)被「燒入」。

「教訓」 - 如,我試圖編譯的文件夾移動到不同的路徑,全亂套了:-)

我的觀點:修改specs文件,以使它們指向的路徑在您的安裝就GCC而言,這似乎是絕對正常的。

0

當你編譯GCC時,你需要傳遞你想要的前綴configure。那時候,你也可以給它--with-specs選項。根據我的實驗,選項--with-specs='%{!static:%x{-rpath='$prefix'/lib64} %x{-enable-new-dtags}}'(其中$prefix should be replaced by the same path you pass to --prefix`)可以工作(當然,您需要一些更復雜的multilib支持)。

注意事項:

  • 這是不正確記錄的任何地方,但現在看來,不像普通spec files,該--with-specs配置選項適用於傳遞給GCC本身的命令行參數。因此,您不能只嘗試修改*link規格字符串。
  • %x序列不會更改GCC命令行,但會累積傳遞給鏈接器的參數。這就是爲什麼我直接通過-rpath-enable-new-dtags而不是通過-Wl
  • 網上有很多關於規格通過的建議。我沒有在任何地方看到這個,所以它帶着一粒鹽。我使用我自己的原因是所有其他人修改一個像*link這樣的規格字符串,你不能用--with-specs來做,或者他們使用-Wl向GCC命令行添加選項,我相當肯定有人說他們遇到了麻煩因爲在某些情況下,當它們沒有鏈接時會混淆海灣合作委員會。因人而異。
  • 如果你使用bootstrapping(除非建立了一個交叉編譯器,這種情況下我可能是錯誤的,但我認爲這個特殊的rpath技巧無論如何都是有用的),這會給GCC程序增加一個RUNPATH還有共享庫。這似乎是正確的選擇,因爲它們是針對現在處於$prefix/lib64的庫進行編譯的,但值得注意。
  • 我加了-enable-new-dtags,它把這個放在DT_RUNPATH而不是DT_RPATH。這是更新的屬性,所有的文檔說應該是首選,<諷刺>這就是爲什麼它需要一個額外的標誌,在文檔< /諷刺>未明確交叉引用。 RPATH和RUNPATH之間的區別如下:

    • 如果存在RUNPATH,RPATH將被完全忽略。
    • RPATH覆蓋LD_LIBRARY_PATH; RUNPATH不會。
    • 它們對依賴項的依賴性有些不同(RUNPATH僅搜索直接依賴項;只要依賴項鍊中沒有任何項具有RUNPATH,就搜索RPATH)。更多細節可在here
    • 我認爲這就是一切,但如果我錯過了某些東西,我不會感到驚訝。

    正如我上面鏈接的文章指出,不是每個人都喜歡到RUNPATH RPATH,但在這裏,除非你混用需要不同的編譯器的支持庫就比較複雜了不同的編譯器代碼,它不應該是一個問題,如果你這樣做,我不認爲有任何一刀切的解決方案。