2012-04-17 54 views
0

(我在Windows上。)爲什麼總是說「未定義的參考」?

我測試了C程序我編一個DLL(libsox)看起來是這樣的:那就是在DLL中定義

#include <stdio.h> 
#include "sox.h" 

int main(void) { 
    char const * versionText = sox_version(); 
    printf(versionText); 
    return 0; 
} 

功能在sox.h的原型如下(這個東西包含cdecl):

LSX_RETURN_VALID_Z LSX_RETURN_PURE 
char const * 
LSX_API 
sox_version(void); 

這裏的問題:當我嘗試建立文件與gcc -lsox -o test.exe test.c我得到以下兒ROR:

C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ccSS2h2z.o:test.c:(.text+0xf): undefined reference to `sox_version' 
collect2: ld returned 1 exit status 

一個字-lsox:我在MinGW的的lib文件夾中的庫文件 「libsox.dll.a」。如果我寫-lsoxnonsense,那麼它說沒有圖書館。這意味着在所示的情況下它找到了圖書館。那麼,爲什麼它不想創建一個鏈接。

+0

您是否使用相同的編譯器構建了該庫?有時'_'會被前置符號名稱。 – 2012-04-18 00:00:24

+0

是的,它是相同的編譯器。我認爲目標文件和.a文件都包含_sox_version。 – rynd 2012-04-18 00:15:34

回答

2
gcc -lsox -o test.exe test.c 

你必須首先把源文件:

gcc test.c -lsox -o test.exe 

這是因爲鏈接經過輸入文件按順序找到未定義的引用和滿足引用它之前看到的。所以在你的命令行中,它讀取libsox.a(或類似的東西),找到未定義的引用(將不存在)。然後,它轉到您的test.c,在那裏找到未定義的引用,但沒有其他庫可以滿足它們。

See this answer for more info.

+0

謝謝,這個伎倆!起初我發現它很奇怪,因爲幫助中提到「Usage:gcc [options] file ...」。但我認爲你的意思是庫文件也是一個輸入文件。因此,「gcc -o test.exe test.c -lsox」也可以使用,而gcc與其聲明的用法不一致。 – rynd 2012-04-18 00:26:34