我去年在Linux中实现了信号量。但为此,我必须使用-lpthread。
现在,在用C实现log10()函数时,我浏览了INTERNET,我发现我必须使用-lm。
我想知道为什么这种命令行参数在Linux.And中是必需的,这个规则是面向编译器的吗?
(在windows Turboc编译器中,我从未使用过此类参数。)
发布于 2011-08-03 16:58:32
您正在指示编译器查找某些库,并使用它们尝试并生成最终的对象文件。
在执行线程代码时,使用了线程原语。这些线程原语是在一个名为pthread的库中实现的,-lpthread告诉链接器使用库pthread,如果不提供此开关,编译器将无法生成有效的对象文件,因为它缺少线程代码实现。
在文件系统中,库可以在/usr/lib和lib (以及其他文件)中找到,当您查看这些目录时,会看到文件以lib前缀开头。例如,libpthreadxxxxxx。你必须自己做研究,才能弄清楚xxxx是什么意思。
使用unix样式工具的开发周期表面上是非常细粒度的,当您使用重量级IDE的(read: visual studiio for C++)时,IDE将与大量标准库进行隐式链接,因此通常不需要提供将要使用的库的名称。但是,当您开始进行更高级的编程时,您可能需要安装和配置您的IDE以使用外部代码库。如果要在visual studio中使用线程原语,则很可能不必向编译器提供查找线程原语的信息,Microsoft认为这是一个公共库,每个新项目都将隐式地针对它进行链接。
--略论GCC
GCC是一个非常多样化的编译器,为各种不同的使用场景生成代码。因此,他们尽量保持中立,不作任何假设。例如,p线程是一个特定的线程原语实现。然而,即使到现在为止,至少在Linux上它是事实上的标准,它并不是唯一的标准。其他Unix实现有不同的实现。当存在这样的选择时,编译器开发人员隐式地链接到库中是不公平的。但是,它们会隐式地针对标准库进行链接;例如,G++只是到内部编译器代码的包装器命令,它是一个C++前端,因此它隐式地链接到C++标准库的实现。类似地,C前端链接到标准C库。
人们通常不想使用某些标准库实现,相反,他们可能想要使用另一个实现,在这种情况下,您必须明确通知编译器使用您提供的实现。这样的用例是非常细粒度的,是G++的表面级问题。在visual中,您需要进行大量的修改才能做出这样的更改,因为它不再是一个预期的用例了。
维基百科将为您提供更多的信息。
编辑:我稍后将修复拼写和语法问题:D
发布于 2011-08-03 16:52:08
选项-l向gcc指出链接必须使用哪些库。-lpthread代表“使用p线程库”,-lm代表“使用m库”,即数学库。这些命令相对于gcc,而不是linux。
发布于 2011-08-03 16:52:55
因为默认情况下,gcc只有链接 the C库(libc),其中包含了众所周知的函数printf、scanf等等。
log10存在于另一个名为libm的库中,因此您需要明确地告诉gcc将该库与-lm链接。同样的逻辑也适用于-lpthread。
https://stackoverflow.com/questions/6930114
复制相似问题