为什么总是说“未定义参考”?
(我在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
,在那里找到未定义的引用,但没有更多的库来满足它们。
有关详细信息,请参阅此答案。