2011-04-09 92 views
17

當使用-l選項(比如說-lfoo)鏈接庫時,如果找到兩者(將更喜歡libfoo.solibfoo.a),gcc將優先選​​擇共享對象到靜態庫。有沒有辦法讓gcc更喜歡靜態庫,如果兩者都找到了?使鏈接時,gcc偏好靜態庫共享對象?

我試圖解決的問題是:我創建一個插件應用程序(飛行模擬器稱爲X平面),有以下限制:

  • 插件是即使在64位系統上運行時也是32位共享對象的形式運行環境不提供加載不在「正常」位置中的共享對象的便利方式,如/usr/lib/usr/lib32
    • 一個不能指望用戶設置LD_PRELOADLD_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爲好,但這並沒有帶來預期的結果,無論是

回答

5

就在.a文件添加到鏈接線不-l就好像它是一個.o文件。

7

您可以指定靜態庫的完整路徑,而不需要-l標誌與這些標誌鏈接。

gcc ... source.c ... /usr/lib32/libmysuperlib.a ...