我坐在一個我沒有真正控制的環境中(它不只是我,所以基本上,我不能改變環境或贏得' t爲其他人工作),我唯一可以影響的是二進制文件是如何構建的。忽略LD_LIBRARY_PATH並堅持鏈接時通過-rpath給出的庫
我的問題是,環境指定了一個LD_LIBRARY_PATH,其中包含一個與正在使用的編譯器不兼容的libstdC++。我試着靜態編譯它,但對g ++來說似乎不可能(版本4.2.3,似乎在後來的版本中已經完成了這方面的工作,儘管它不可用,-static-libstdC++或類似的東西)。
現在我已經到達使用rpath將絕對路徑名稱烘焙到可執行文件中(可以工作,它應該運行的所有機器都是相同的)。不幸的是,似乎LD_LIBRARY_PATH優先於rpath(重置LD_LIBRARY_PATH確認它能夠找到該庫,但如上所述,將爲每個人設置LD_LIBRARY_PATH,並且我無法更改它)。
有沒有什麼辦法可以使rpath優先於LD_LIBRARY_PATH,還是有任何其他可能的解決方案來解決我的問題嗎?請注意,我在運行時討論動態鏈接,我可以在編譯和鏈接時控制命令行。
謝謝。
我看過這篇文章,'僞造'沒有'.so'文件的目錄可能有效。我只能改變編譯器和命令行(儘管我想我可以將編譯器改爲腳本),但我也許可以創建自己的lib目錄。我會給它一個鏡頭。至於第二部分,這是一個Solaris環境,我做的測試是:'ldd binary'從LD_LIBRARY_PATH生成庫,'LD_LIBRARY_PATH = ldd binary'生成一個(不重要的)烘焙文件。我不知道這些東西是如何實現的,我只能告訴你我看到了什麼。 – falstro 2010-03-10 08:58:33
聲明在Solaris下'LD_LIBRARY_PATH'優先於'DT_RPATH'是* [絕對正確](http://docs.oracle.com/cd/E19082-01/819-0690/chapter6-63352/index.html) *只要進程不符合[安全進程]的定義(http://docs.oracle.com/cd/E19683-01/816-1386/6m7qcobkt/index.html)。 – vladr 2013-05-02 18:46:53