2010-10-12 205 views
0

我有一些靜態庫。例如libpuchuu.a 它取決於動態庫。例如libSDL.so (五言,但我有libSDL.a) 創作libpuchuu.a的很簡單:g ++靜態庫依賴於動態庫

ar -rcs object_file_1.o object_file_2.o 

但我不能libpuchuu.a鏈接到我的項目! 未定義的引用攻擊我的控制檯!

在一些論壇上,我已經發現了這樣一句話: 靜態庫的所有依賴關係是在該庫 如果你的目標文件依賴於雅,你必須解壓(AR)雅對象文件 到您的文件夾,然後收拾所有對象你的新圖書館。問題:

  1. 它是真的嗎?
  2. 如果它是真的: 對象文件puchuu.o取決於libSDL.a 如何使libpuchuu.a?
  3. 另一種解決方案?

PS

我做了一個簡單的例子,並張貼到引擎收錄:

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 

...從指數 未定義的引用的.cpp!

+1

您應該詳細說明未定義的引用出現的位置。這可能會導致共享對象丟失。 – 2010-10-12 20:23:24

+0

你能否把它作爲文字而不是圖像? – Omnifarious 2010-10-12 20:25:34

+0

哦,男人,有關於sdldraw的俄羅斯警告! (這應該是壞的!):) – 2010-10-12 20:29:55

回答

2

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

未定義的參考符號是您嘗試在lib.cpp中定義的符號,您使用ar將其封裝在libpuchuu.a中。不幸的是,你沒有定義你認爲你定義的符號。 using namespace sdl;不會自動導致您定義的所有內容位於sdl名稱空間中。它所做的一切就是安排它,以便在編譯器查找特定名稱時,它會在sdl名稱空間中與主命名空間一起查找它。

您需要將lib.cpp中定義的函數與namespace sdl { .... functions ... }包裝起來,並且您的代碼將很好地鏈接。

根據我的經驗,當我用一些不熟悉的東西犯了一個錯誤時,錯誤通常是一個非常愚蠢的錯誤,與我不熟悉的東西無關。但是因爲我在未知領域工作,我自動假設我缺乏對領土的認識必須有過錯,而不是我做了一些愚蠢的事情。

你可能會發現我的經驗適用。作爲一個便箋,'未定義的引用攻擊你的控制檯'的想法是相當有趣的奇怪,並留下你的屏幕和鍵盤的圖像留在吸菸的廢墟中,你嘗試鏈接後。

+0

的cource。但未定義的引用攻擊! – puchu 2010-10-12 20:21:26

+0

@puchu - 添加'-lSDL'應該可以解決您的問題。如果您提供更多關於您正在運行的確切命令的詳細信息,那麼實際問題可能會被揭露,並且隱藏在其藏身的地方。 – Omnifarious 2010-10-12 20:23:42

+0

>>未定義的引用是你在lib.cpp中定義的符號。正如你看到的答案是如何解決它。只是寫... – puchu 2010-10-12 20:46:36