2014-03-25 120 views
1

我創建了一個靜態庫libstuff.a,其中gccar。我已經安裝了/custom/lib/dir/的庫和/custom/include/dir/的頭文件。當我嘗試編譯另一個應用程序對存檔時,我遇到了問題。編譯時遇到靜態庫問題

我想編譯的應用程序基本上使用gcc -L/custom/lib/dir/ -I/custom/include/dir/ -lstuff

當我嘗試編譯時,我得到關於我在stuff.h中聲明的函數的錯誤,並在stuff.c中定義。

main.c:51: undefined reference to `stuff_init' 
collect2: error: ld returned 1 exit status 

如果我從/custom/lib/dir/刪除libstuff.a編譯器會抱怨/usr/bin/ld: cannot find -lstuff。如果我把它放回去,它不會抱怨。所以它正確地找到了檔案。

如果我從main.c中刪除#include "stuff.h"這行代碼,gcc抱怨stuff_init未定義,所以它正確地找到了標題。

如果我運行nm libstuff.a,則輸出包括0000000000000000 T stuff_init。所以該功能是在存檔文件中定義的。

那麼我做錯了什麼?

+0

共享庫不是用'àr(1)'創建的,'libfoo.a'是一個* static *庫。檢查你的構建說明。 – vonbrand

+0

對不起,我的意思是說靜態而不是共享。謝謝:) – Josh

+0

你真的應該顯示你的確切和完整的鏈接命令行。 「基本上」很好,但不夠具體。 –

回答

5

你不顯示您的確切聯線,但機會是你應該(但不要)的目標文件後列出庫:

gcc -o program main.o -L/custom/lib/dir -lstuff 

如果有一個以上的目標文件以外圖書館,然後列出所有圖書館之前。 -L選項可能會在使用來自給定目錄的庫的-llib選項之前的任何位置。

+0

解決了它。我有我的'-l'和'-L'標誌出現在我的對象文件之前。謝謝! – Josh