c - 为什么在 Linux 编译器中编译和运行 C 程序时需要额外的参数?

标签 c gcc command-line-arguments

我去年在 Linux 中实现了信号量。但为此我必须使用 -lpthread

现在,在用 C 实现 log10() 函数时,我上网冲浪,发现必须使用 -lm

我想知道为什么这些命令行参数在 Linux 中是必需的。这条规则是面向编译器的吗?

(在 Windows Turboc 编译器中,我从来没有使用过这种参数。)

最佳答案

您正在指示编译器查找某些库并使用它们来尝试生成最终目标文件。

当您编写线程代码时,您使用了线程原语。这些线程原语在名为pthread 的库中实现,-lpthread 告诉链接器使用库pthread,如果不提供此开关,编译器将无法生成有效的目标文件,因为它缺少线程代码实现。

在文件系统上,可以在/usr/lib 和 lib(以及其他目录)中找到这些库,当您查看这些目录时,您会看到以 lib 前缀开头的文件。例如 libpthreadxxxxxx。您必须自己进行研究才能弄清楚 xxxx 的含义。

使用 unix 风格工具的开发周期表面上非常精细,当您使用重量级 IDE(阅读:visual studiio for C++)时,IDE 隐含地链接到大量标准库,因此您通常不需要提供您将常用的库的名称。但是,当您开始进行更高级的编程时,您可能必须安装和配置 IDE 才能使用外部代码库。如果您要在 visual studio 中使用线程原语,您很可能不必向编译器提供有关在何处查找线程原语的信息,Microsoft 认为这是一个公共(public)库,每个新项目都会隐式链接到它。

关于 GCC 的一些讨论

GCC 是一个非常多样化的编译器,可以为各种不同的使用场景生成代码。因此,他们尽量保持中立,不做假设。例如 pthread 是一个特定的线程原语实现。然而,即使到现在在 Linux 上它至少是事实上的标准,而不是唯一的标准。其他 Unix 实现有不同的实现。当存在这样的选择时,编译器开发人员隐式链接库是不公平的。然而,它们确实隐含地链接到标准库;例如,G++ 只是内部编译器代码的包装命令,它是 C++ 前端,因此它隐式链接到 C++ 标准库的实现。同样,C 前端链接到标准 C 库。

人们通常不想使用某些标准库实现,而可能想使用另一种实现,在这种情况下,您必须明确通知编译器使用您提供的实现。此类用例非常细化,是 G++ 的表面问题。在 visual studio 中,您通常需要进行大量修改才能进行此类更改,因为它不再是预期的用例。

维基百科将为您提供更多information .

编辑:我稍后会修复拼写和语法问题 :D

关于c - 为什么在 Linux 编译器中编译和运行 C 程序时需要额外的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930114/

相关文章:

ant - 如何通过命令行设置日志级别

c - int main 中的双指针

c - C语言输出字符串的三元运算

C 程序在一个系统上编译和运行,而不是在另一个系统上

c - 使用常量结构时为 "initializer element is not constant"

c++ - 检测二进制文件的 GCC 编译时标志

java - Picocli 需要基于主要选项的选项选择

c - 如何链接到我自己的 pthread 库

c++ - 从 C++ 代码创建静态库并与 iPhone SDK 链接

go - Golang命令参数为空导致错误