0

我使用这个命令来编译我的程序:

gcc -g -Wall -Werror -lpthread multi_thread_server.c -o multi_thread_socket_v4

它给出了undefined reference to <function_name>错误。

经过大量的反复试验以修复错误,最后我(错误地)将选项重新排列gcc为:

gcc multi_thread_server.c -lpthread -Wall -Werror -o multi_thread_server -g

它奏效了。

我在 SO阅读了这个问题,我得到了它发生的原因。

在这里我想知道,用于的选项顺序是否有任何规则gcc

PS:我知道有无限的选项可供选择gcc,我想知道根据选项类别的顺序。

4

1 回答 1

7

最后列出库。

编译后,GCC 将文件传递给链接器以进行链接(除非不执行链接,当您使用-c开关请求仅编译时会发生这种情况)。它按照您在命令行上列出它们(或它们相应的输入)的顺序将文件传递给链接器。

您列出-lpthread了(这意味着 pthread 库,命名libpthread.a或类似的东西),然后是multi_thread_server.c(被编译为名为 . 的目标文件multi_thread_server.o。因此链接器首先接收库,然后接收目标文件。

当链接器处理一个库文件时,它只从中提取提供符号定义模块,该定义需要满足对该符号的早期引用。由于库是第一个文件,因此没有更早的引用。当链接器处理multi_thread_server.o时,它会看到引用,但为时已晚;链接器不会返回库。

如果您multi_thread_server.c首先列出,链接器将multi_thread_server.o首先看到,它会看到它有未满足的引用。然后,当链接器处理库时,它将找到这些引用的定义,并从库中提取这些模块。

于 2013-08-22T19:30:58.390 回答