c - 用于编译的 GCC 链接库

标签 c linux gcc

当信息已经以 #include 的形式存在于源文件中时,为什么我们必须告诉 gcc 要链接哪个库?

例如,如果我有一个使用线程的代码并且有:

#include <pthread.h>

我仍然需要在 gcc 中使用 -pthread 选项编译它:

gcc -pthread test.c

如果我不提供 -pthread 选项,它将在查找线程函数定义时出错。

我正在使用这个版本:

gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

最佳答案

这可能是 C 语言初学者最常犯的错误之一。

在 C 中,构建程序有两个不同的步骤,即编译和链接。出于您的问题的目的,这些步骤将您的代码连接到两种不同类型的文件、 header 和库。

#include <pthread.h> C 代码中的指令由编译器处理。编译器(实际上是预处理器)按字面意思粘贴了 pthread.h 的内容。在将 C 文件转换为目标文件之前将其写入您的代码。

pthread.h是头文件,不是库。它包含您可以在库中找到的函数列表、它们采用的参数以及它们返回的内容。 header 可以在没有库的情况下存在,反之亦然。 header 是一个文本文件,通常在 /usr/include 中找到在 Unix 衍生系统上。您可以像打开任何 C 文件一样打开它来阅读内容。

命令行gcc -lpthread test.c编译和链接。在过去,你首先会做类似 cc test.c 的事情。 , 然后 ld -lpthread test.o .如您所见,-lpthread实际上是链接器的一个选项。

链接器对诸如 C 代码或 header 之类的文本文件一无所知。它仅适用于已编译的目标文件和现有库。 -l标志告诉它要查看哪些库以查找您正在使用的函数。

关于c - 用于编译的 GCC 链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35299711/

相关文章:

c - 返回正确值但目标变量错误的 C 函数调用

c# - 我们应该为新项目选择 Java 而不是 C# 吗?

c# - Linux 中的 SSL WebRequest

c - 为什么 gcc 给出警告 : implicit declaration of function qsort_r?

c++ - 为类 move 构造函数和 move 赋值运算符

c - C中字符串的数组和指针表示法之间的区别

c - scanf 在其执行点之前工作

结构体的C动态 vector

Linux - 使用 ls 或 find 命令查找所有者可执行的隐藏文件

c - 无符号整数位域移位产生有符号整数