1

(我在 Windows 上。)

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

#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

一句话:我在 MinGW 的文件夹-lsox中有库文件“libsox.dll.a” 。lib如果我写-lsoxnonsense,那么它说没有图书馆。这意味着在所示情况下它会找到库。那么它为什么不想创建一个链接。

4

1 回答 1

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

您必须首先放置源文件:

gcc test.c -lsox -o test.exe

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

有关更多信息,请参阅此答案。

于 2012-04-18T00:05:09.047 回答