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。 然后,当链接器处理库时,它将找到这些引用的定义,并将从库中提取这些模块。