我大致理解cc、ld和其他部分是按照Makefiles等方案按一定顺序调用的,其中一些命令用于生成这些信任和Makefile。还有一些其他工具用于处理库。但是其他的部件是用来做什么的呢?在这个过程中,他们是如何被调用的?哪个工具将使用不同的解析器生成器?哪一部分是可选的?为什么?
对于GNU或LLVM/Clang工具链中的工具是如何在C/C++项目构建中组织和调用的,是否有一个简短的总结?
提前谢谢。
编辑:
以下是Mac上Clang/LLVM的可执行文件列表:
ar gperf libtool rpcgen unwinddump作为clang++侏儒gprof lorder otool cmpdylib dyldinfo缩进m4分页器大小bison codesign_allocate flexinstall_name_tool mig标签flex++ flex++ mkdep rebase unifdef cc ctf_insert gm4 lex nm redo_prebinding unifdefall
发布于 2012-11-11 19:11:20
大多数这些工具没有在标准项目中使用--我自己从未见过其中的一半。
就实际运行的进程而言,这是基本的工作流:
gcc
|
v
cc1 -> as -> collect2 -> ld这本身并没有告诉你那么多。没有cpp (预处理程序)--集成到cc1中。cc1本身就是后端和“真正的”编译器-- gcc二进制文件是执行实际工作的所有工具的前端。cc1是预处理器/编译器后端,它编译成程序集。as是汇编程序,它生成对象文件。collect2 (我自己忘记了这一点,只是因为我运行了一个strace才知道这一点)有助于在可执行文件(来自这里)中安排启动代码。最后,ld将对象文件和库链接到最终的可执行文件中。
对于这些单独组件的实际使用,通常更好的方法是调用gcc并让它知道该做什么。例如,可以在gcc -S文件上运行.c以生成.s辅助文件,也可以运行gcc -E只对源文件进行预处理。
基本上,man gcc就是您想要阅读的内容。或者至少浏览一下。
https://softwareengineering.stackexchange.com/questions/175143
复制相似问题