我用这个命令来编译我的程序:
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
,并且它将看到它具有未满足的引用。然后,当链接器处理库时,它将查找这些引用的定义,并从库中提取这些模块。