我用这个命令来编译我的程序:
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
有无限选项,我想根据选项类别了解序列。
答案 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
,并且会看到它已经不满意参考。然后,当链接器处理库时,它将找到这些引用的定义,并将从库中提取这些模块。