gcc& amp;的正确选项顺序是什么?这个序列的重要性?

时间:2013-08-22 18:56:19

标签: 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

并且有效。

我读了this question at SO,我明白了为什么会这样。

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

P.S。:我知道gcc无限选项,我想根据选项类别了解序列。

1 个答案:

答案 0 :(得分:8)

最后列出库。

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