(我在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
,那么它说没有库。这意味着在所示的情况下它找到了库。那么为什么不想创建一个链接。
答案 0 :(得分:3)
gcc -lsox -o test.exe test.c
您必须先放置源文件:
gcc test.c -lsox -o test.exe
这是因为链接器按顺序遍历输入文件,查找未定义的引用并满足之前看到的引用。所以在你的命令行中,它会读取libsox.a
(或类似的东西),找到未定义的引用(没有)。然后,它转到你的test.c
,在那里找到未定义的引用,但没有更多的库来满足它们。