为什么总是说“未定义参考”?

(我在Windows上。)

我正在使用C程序测试我编译的DLL( libsox ),它看起来像这样:

#include  #include "sox.h" int main(void) { char const * versionText = sox_version(); printf(versionText); return 0; } 

DLL中定义的函数在sox.h有以下原型(其中包含cdecl ):

 LSX_RETURN_VALID_Z LSX_RETURN_PURE char const * LSX_API sox_version(void); 

这是问题所在:当我尝试使用gcc -lsox -o test.exe test.c构建文件时,出现以下错误:

 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 ,那么它说没有库。 这意味着在所示的情况下,它找到了库。 那么为什么不想创建链接呢?

 gcc -lsox -o test.exe test.c 

您必须先放置源文件:

 gcc test.c -lsox -o test.exe 

这是因为链接器按顺序遍历输入文件,查找未定义的引用并满足它之前看到的引用。 所以在你的命令行中,它读取libsox.a (或类似的东西),找到未定义的引用(没有)。 然后,它转到你的test.c ,在那里找到未定义的引用,但没有更多的库来满足它们。

有关详细信息,请参阅此答案。