簡體   English   中英

在鏈接時使gcc更喜歡靜態庫到共享對象?

[英]making gcc prefer static libs to shared objects when linking?

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

我正在嘗試解決的問題如下:我正在為應用程序(飛行模擬器稱為X-Plane)創建一個插件,具有以下約束:

  • 即使在64位系統上運行,插件也應采用32位共享對象的形式
  • 運行環境不提供一種方便的方法來加載不在“正常”位置的共享對象,例如/usr/lib/usr/lib32
    • 我不能指望用戶設置LD_PRELOADLD_LIBRARY_PATH來查找我的插件附帶的共享對象
    • 在動態加載插件共享對象之前,X-Plane運行環境不會將我的插件目錄添加到``LD_LIBRARY_PATH,這將允許我將所有必需的共享對象與我的插件共享對象一起發送
  • 我不能指望64位用戶安裝非平凡的32位共享對象(比如說,不包含在ubuntu上的ia32-libs包中)

為了解決上述約束,一種可能的解決方案是將生成的共享對象鏈接到所使用的所有非平凡庫的靜態32位版本。 但是,在安裝這些庫時,通常會安裝靜態和動態版本,因此gcc將始終鏈接到共享對象而不是靜態庫。

當然,移動/刪除/刪除有問題的共享對象,只是將靜態庫放在說/usr/lib32 ,是一種解決方法,但它不是一個好的

注意:

  • 是的,我確實閱讀了如何鏈接共享對象和庫,我並沒有嘗試創建一個“完全靜態鏈接的共享對象”
  • 是的,我試過-Wl,-static -lfoo -Wl,-Bdynamic,但沒有帶來預期的結果
  • 是的,我嘗試了-l:libfoo.a ,但這也沒有帶來預期的結果

您可以指定靜態庫的完整路徑,而不使用-l標志來鏈接這些庫。

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

只需將.a文件添加到沒有-l的鏈接行,就好像它是.o文件一樣。

它已過時,但可能有效: http//www.network-theory.co.uk/docs/gccintro/gccintro_25.html

(幾乎在頁面的末尾)

如前所述,通過在命令行上指定庫的完整路徑,也可以直接鏈接到各個庫文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM