當使用-l
選項(比如說-lfoo
)鏈接庫時,如果找到兩者(將更喜歡libfoo.so
到libfoo.a
),gcc將優先選擇共享對象到靜態庫。有沒有辦法讓gcc更喜歡靜態庫,如果兩者都找到了?使鏈接時,gcc偏好靜態庫共享對象?
我試圖解決的問題是:我創建一個插件應用程序(飛行模擬器稱爲X平面),有以下限制:
- 插件是即使在64位系統上運行時也是32位共享對象的形式運行環境不提供加載不在「正常」位置中的共享對象的便利方式,如
/usr/lib
或/usr/lib32
:- 一個不能指望用戶設置
LD_PRELOAD
或LD_LIBRARY_PATH
找到我的插件附帶的共享對象 - 在動態加載插件共享對象之前,X-Plane運行環境不會將我的插件目錄添加到LD_LIBRARY_PATH,這將允許我將所有我需要的共享對象沿着我的插件共享對象
- 一個不能指望用戶設置
- 人們不能指望64個用戶安裝32位共享對象是不平凡的(比方說,沒有在IA32-庫包ubuntu上包括)
到解決上述約束,一個可能的解決方案是鏈接生成的共享對象ct使用靜態32位版本的所有非平凡庫。但是在安裝這樣的庫時,通常會安裝靜態和動態版本,因此gcc將始終鏈接到共享對象而不是靜態庫。
當然,移動/刪除/刪除共享對象的問題,只是在離開靜態庫中說/usr/lib32
,是一個變通,但它不是一個很好的一個
注:
- 是的,我也閱讀了關於如何鏈接共享對象&庫,而我並不想creatae一個「完全靜態鏈接的共享對象」
- 是的,我試過
-Wl,-static -lfoo -Wl,-Bdynamic,
但並沒有帶來預期的結果 - 是的,我試過
-l:libfoo.a
爲好,但這並沒有帶來預期的結果,無論是