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

时间:2012-04-17 23:56:04

标签: c gcc dll linker mingw

(我在Windows上。)

我正在测试我编译的DLL(libsox)和一个看起来像这样的C程序:

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

1 个答案:

答案 0 :(得分:3)

gcc -lsox -o test.exe test.c

您必须先放置源文件:

gcc test.c -lsox -o test.exe

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

See this answer for more info.