簡體   English   中英

g ++靜態庫取決於動態庫

[英]g++ static library depends on dynamic libraries

我有一些靜態庫。 例如libpuchuu.a,它取決於動態庫。 例如libSDL.so(但是當然我有libSDL.a)libpuchuu.a的創建很簡單:

ar -rcs object_file_1.o object_file_2.o

但是我無法將我的項目與libpuchuu.a鏈接! 未定義的引用攻擊了我的控制台!

在某個論壇上,我發現了這樣的句子:如果您的對象文件依賴於ya,則必須將靜態庫的所有依賴項都存儲在該庫中,您必須將對象文件解壓縮到文件夾中,然后將所有對象打包到新庫中。 問題:

  1. 這是真的嗎?
  2. 如果是真的:目標文件puchuu.o取決於libSDL.a如何制作libpuchuu.a?
  3. 另一個解決方案?

PS

我做了一個簡單的例子,並將其發布到pastebin:

http://paste.lisp.org/display/115456

構建命令:

g++ -O3 -c index.cpp -I/usr/local/include/SDL
g++ -O3 -c lib.cpp -I/usr/local/include/SDL
ar rv libpuchuu.a lib.o
g++ -O3 -o program.exe index.o -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows -lSDL_image -L. -lpuchuu

...來自index.cpp的未定義引用!

您是否嘗試過將-lSDL添加到鏈接器的命令行中?

未定義的引用是您要嘗試在lib.cpp中定義的lib.cpp ,您可以使用ar將這些符號打包到libpuchuu.a 不幸的是,您沒有定義您認為正在定義的符號。 using namespace sdl; 不會自動導致您定義的所有內容都在sdl名稱空間中。 它所做的只是安排它,以便當編譯器查找特定名稱時,它將在sdl名稱空間以及主名稱空間中查找它。

您需要使用namespace sdl { .... functions ... }來包裝lib.cpp定義的namespace sdl { .... functions ... } ,您的代碼將可以很好地鏈接。

以我的經驗,當我對一個陌生的東西犯錯時,錯誤通常是一個愚蠢的錯誤,與我不熟悉的事物無關。 但是因為我在未知地區工作,所以我會自動認為我對該地區的了解不足一定是過錯的,而不是我做過一些愚蠢的事情。

您可能會發現我的經驗適用。

而且,作為一個旁注,“未定義引用攻擊您的控制台”的想法非常有趣,並且在嘗試鏈接后,屏幕和鍵盤的圖像留給了我,這是煙熏的廢墟。

暫無
暫無

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

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