gcc的正确选项顺序是什么?该序列的重要性是什么?

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

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

它给undefined reference to 错误提供了undefined reference to

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

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

它工作。

我在SO读到这个问题 ,我明白了为什么会这样。

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

PS:我知道gcc无限的选项,我想根据选项的类别知道序列。

列表库最后。

编译之后,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 ,并且它将看到它没有满足referencs。 然后,当链接器处理库时,它将找到这些引用的定义,并将从库中提取这些模块。