2015-05-09 77 views
4

我想在Linux中對我的可執行文件中的庫進行硬編碼。在OS X上,這是通過在構建庫時提供-o參數後面的完整路徑來實現的。例如,我建在OS X這樣的庫:如何在Linux上對動態庫路徑進行硬編碼

cc foo.c --shared -o /home/sander/libfoo.so 

當我建立所謂的「酒吧」,與此庫鏈接的可執行文件,我用otool -L上的可執行文件,我得到這樣的輸出:

bar: 
    /home/sander/libfoo.so (compatibility version 0.0.0, current version 0.0.0) 

我現在可以從任何地方運行這個可執行文件,它總是能夠找到庫。

我正在使用gcc在Linux上尋找等效的功能。我寧願不使用rpath,因爲它沒有鏈接到特定的庫+路徑。

+1

有沒有一個原因,你不能只是靜態鏈接?如果你擔心被移動的東西,那似乎是更安全的選擇。 –

+0

我無法靜態鏈接。此功能是包管理系統的一部分,我必須能夠更新單個包。我不太關心圖書館正在搬遷。更重要的是,我可以從系統的任何地方找到這些庫。 –

回答

4

只是編譯這樣,所以不要使用-llib而是將其指定爲對象進行編譯:

cd /full/path/to/lib 
gcc -shared -fpic -o liblib.so lib.c    # make the lib 
gcc -c -o prog.o prog.c       # compile program 
gcc -o prog prog.o "/full/path/to/lib/liblib.so" # link everything together 

編輯:我最初寫的是在OS X上不會也罷,絕對或在-o選項後指定相對路徑。那是不是真的。它確實會影響Mach-O LC_ID_DYLIB加載命令中庫的「名稱」。謝謝@桑德爾梅爾滕斯讓我知道。

+0

謝謝,這工作!雖然我不同意。 otool顯示,在與該庫鏈接時使用-o後指定的任何內容。我只是在OS X上再次驗證它,根據-o的參數,otool顯示不同的輸出。 –

+0

@SanderMertens對此表示歉意,並感謝您告訴我。編輯答案。 –

相關問題