c语言 - gcc 的正确选项顺序是什么以及该序列的重要性?



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

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,我想知道根据选项类别的顺序。

最后列出库。

编译后,GCC 将文件传递到链接器进行链接(除非不执行链接,就像使用 -c 开关请求仅编译时发生的那样(。它按照您在命令行上列出文件(或其相应输入(的顺序将文件传递到链接器。

您列出了-lpthread(这意味着名为 libpthread.a 或类似内容的 pthread 库(,后跟 multi_thread_server.c(编译为名为 multi_thread_server.o 的对象文件。因此,链接器首先接收库,然后接收对象文件。

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

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

最新更新