簡體   English   中英

靜態庫中的鏈接失敗,但共享庫中的鏈接成功

[英]Linking in a static library failes, but linking a shared library succeeds

我可以針對共享庫構建應用程序,但將其與同一庫的靜態版本鏈接時出現未解決的符號錯誤:

我可以這樣構建我的應用程序:

g++ -lutils application.cpp -o application.exe

上面的命令鏈接了utils庫的共享版本。

我正在嘗試像這樣的靜態版本的庫鏈接:

g++ -l:utils.a application.cpp -o application.exe

兩次我都在使用

export LD_LIBRARY_PATH=path/to/utils:$LD_LIBRARY_PATH

通知g ++ utils.a的放置位置。

ld報告的未解析符號出現在nm的輸出中:

nm --defined-only path/to/utils.a

並標有“ T”(表示它來自代碼部分)。

我正在嘗試找出問題的原因。

使用LD_LIBRARY_PATH指定在哪里搜索utils.a是否正確?

驗證靜態庫定義(解析)符號的確切命令是什么? 是命令

nm --defined-only path/to/utils.a

足夠還是我應該使用其他任何選項,例如

nm --defined-only --demangle path/to/utils.a

例如?

對於編譯器來說,僅選項-static應該足夠了。 如果只有一個庫必須是靜態的,則-static-和lib name是短名稱而不是文件名。

使用LD_LIBRARY_PATH指定在哪里搜索utils.a是否正確?

  1. 如@ user10605163所述,LD_LIBRARY_PATH不會在編譯和鏈接時找到靜態庫的路徑。 它是一個環境變量,在某些 Linux發行版中用於在運行時搜索共享庫。 在此處找到更多文檔它對於構建和測試環境很有用,但不是在生產系統中推薦的鏈接方式。

驗證靜態庫定義(解析)符號的確切命令是什么? 是命令nm --defined-only path / to / utils.a

  1. 對,那是正確的。 但是,基於提供的信息,該錯誤不太可能是utils中不存在符號的錯誤(因為它與共享庫一起使用),但具有鏈接。

請參閱GNU文檔GCC鏈接選項摘錄:

-l library:鏈接時搜索名為library的庫。 鏈接器在標准目錄列表中搜索該庫。 搜索的目錄包括幾個標准系統目錄以及您使用-L指定的目錄。

另外,使用-l鏈接選項,您需要提供庫名(不帶“ lib”和擴展名)或完整文件名。 -lutils或-llibutils.a如果需要,也可以僅在此處提供直接的完整路徑。

暫無
暫無

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

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