我很想知道默认情况下使用哪个编译器来构建使用Linux实用程序apt或yum安装的库。这一点很重要,因为如果这些库是用gcc编译的,那么在使用clang编写简单程序时可能会出现兼容性问题,特别是在编译器标志不同的情况下。为了减轻任何潜在的风险,我应该考虑从源代码构建所有的依赖项,还是使用使用gcc构建的库和使用clang编译的主程序是安全的?
whlutmcx1#
这个问题没有一个单一的答案,因为每个发行版都可能有自己的策略。一般来说,gcc更常见,主要是因为大多数发行版在clang出现之前就开始了。然而,它并不像你想象的那么重要。Linux为它支持的每种体系结构都有一个标准ABI,它指定了调用约定、参数传递、结构的内存布局等。例如,在x86-64上,它使用x86-64 SysV ABI。默认情况下,gcc和clang都将生成符合ABI的代码,因此它们将正确地互操作,即使您的库是用一个库编译的,而您的库是用另一个库编译的。大多数常见的调试和优化选项(-g*、-O*、大多数-f优化选项等)都将保持ABI兼容性,因此您(和库打包器)也可以安全地使用它们。编译器确实有一些与ABI不兼容的特殊选项(例如-fpack-struct,-mregparm),但这些选项的文档应该有关于不兼容性的明确警告。除非你使用一些非常古怪的发行版,否则你可以安全地假设你的系统库是在没有使用任何这些选项的情况下构建的,所以如果你也没有使用任何这些选项,你不必担心编译器的选择。
-g*
-O*
-f
-fpack-struct
-mregparm
1条答案
按热度按时间whlutmcx1#
这个问题没有一个单一的答案,因为每个发行版都可能有自己的策略。一般来说,gcc更常见,主要是因为大多数发行版在clang出现之前就开始了。
然而,它并不像你想象的那么重要。Linux为它支持的每种体系结构都有一个标准ABI,它指定了调用约定、参数传递、结构的内存布局等。例如,在x86-64上,它使用x86-64 SysV ABI。默认情况下,gcc和clang都将生成符合ABI的代码,因此它们将正确地互操作,即使您的库是用一个库编译的,而您的库是用另一个库编译的。大多数常见的调试和优化选项(
-g*
、-O*
、大多数-f
优化选项等)都将保持ABI兼容性,因此您(和库打包器)也可以安全地使用它们。编译器确实有一些与ABI不兼容的特殊选项(例如
-fpack-struct
,-mregparm
),但这些选项的文档应该有关于不兼容性的明确警告。除非你使用一些非常古怪的发行版,否则你可以安全地假设你的系统库是在没有使用任何这些选项的情况下构建的,所以如果你也没有使用任何这些选项,你不必担心编译器的选择。