gcc 使用 libnet 时出现未定义引用错误

gcc 使用 libnet 时出现未定义引用错误

我正在尝试使用 libnet 库在 gcc 中编译 C 程序。我的代码中包含了 libnet.h 文件,但当我尝试编译它时,我收到一条错误消息:

/tmp/ccTEOH93.o: In function `main':
random_name.c:(.text+0x2f): undefined reference to `libnet_init'
random_name.c:(.text+0x72): undefined reference to `libnet_seed_prand'
random_name.c:(.text+0x7c): undefined reference to `libnet_get_prand'
random_name.c:(.text+0x8d): undefined reference to `libnet_get_prand'
random_name.c:(.text+0x10a): undefined reference to `libnet_name2addr4'
random_name.c:(.text+0x12e): undefined reference to `libnet_name2addr4'
random_name.c:(.text+0x148): undefined reference to `libnet_hex_aton'
random_name.c:(.text+0x163): undefined reference to `libnet_hex_aton'
random_name.c:(.text+0x192): undefined reference to `libnet_destroy'
collect2: error: ld returned 1 exit status

我尝试在使用 gcc 时手动包含 libnet.h 库或 libnet-functions.h 库(包含上述所有函数)来编译它。仍然没有任何效果。编译器甚至发送了一条错误消息,指出无法找到该库。

我该怎么办?有什么问题?

我尝试通过浏览存储该程序的文件然后输入以下内容来编译它:

 gcc -o example example.c

或者

 gcc -o example example.c -l libnet.h (or just libnet)

在编译我所有的其他程序时,这个方法都有效,我看不出哪里出了问题。我甚至尝试改变 gcc 输入的顺序。

答案1

头文件和库是不同的东西。

头文件(或包含文件) 包含声明对象(指定其类型、大小等)。头文件用于构建的编译阶段,即将源代码转换为特定于体系结构的目标代码时。要包含的头文件的名称在源代码本身中给出,而不是在编译器命令行中给出,例如

#include <foo.h>

如果特定的头文件不在编译器的标准搜索路径上,则可以在命令行上给出其他路径,例如

gcc -o myprog.o -c -I/path/to/foo myprog.c

另一方面,图书馆包含实际的对象定义即实现对象的预编译单元。它们在链接阶段使用(当您的目标文件与任何依赖系统库链接以形成可执行程序时),以及在命令行上指定,例如

 gcc -o myprog myprog.o -lfoo

这里,-lfoo告诉编译器搜索名​​称为libfoo.a或 的库libfoo.so(请注意,前导lib是隐含的,在命令行中省略,即-lfoo而不是-llibfoo)。与头文件一样,可以使用选项来容纳非标准库路径,-L例如

 gcc -o myprog myprog.o -L/path/to/foolib -lfoo

在你的情况下,假设头文件和库都位于编译器期望找到它们的位置,并且你想在单个命令中进行编译和链接,那么你应该使用

gcc -o example example.c -lnet

相关内容