C 为什么它总是说;未定义引用“;?

C 为什么它总是说;未定义引用“;?,c,gcc,dll,linker,mingw,C,Gcc,Dll,Linker,Mingw,(我在Windows上。) 我正在用一个C程序测试我编译的DLL(),它看起来是这样的: #include <stdio.h> #include "sox.h" int main(void) { char const * versionText = sox_version(); printf(versionText); return 0; } 问题是:当我尝试使用gcc-lsox-o test.exe test.c构建文件时,我得到以下错误: C:\DOK

(我在Windows上。)

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

#include <stdio.h>
#include "sox.h"

int main(void) {
    char const * versionText = sox_version();
    printf(versionText);
    return 0;
}
问题是:当我尝试使用
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”。如果我写
-lsoxjussing
,它会说没有库。这意味着在所示的情况下,它会找到库。那么为什么它不想创建一个链接呢

gcc -lsox -o test.exe test.c
您必须首先放置源文件:

gcc test.c -lsox -o test.exe
这是因为链接器按顺序遍历输入文件,查找未定义的引用和它以前看到的令人满意的引用。因此,在您的命令行中,它读取
libsox.a
(或类似的内容),查找未定义的引用(将没有)。然后,它转到您的
test.c
,在其中找到未定义的引用,但没有其他库来满足它们


您是否使用相同的编译器构建了该库?有时一个
\uu
会在符号名前面加上前缀。是的,它是同一个编译器。我认为对象文件和.a文件都包含了_sox_版本。谢谢,这就成功了!一开始我觉得很奇怪,因为帮助上说“用法:gcc[options]file…”。但是我想你的意思是库文件也是一个输入文件。因此,“gcc-o test.exe test.c-lsox”也可以工作,并且gcc与它声明的用法不一致。
gcc test.c -lsox -o test.exe