minix3下编译C和C++程序
2021.12.18 中午1点左右调试成功
=========================
minix3下编译C语言的helloworld
安装了vim,pkgin install vim
cd /home/c_test
vim hello.c
按"i",进入插入模式,把文字输进去,如果打错,需要按esc退回到控制模式,然后按x删除。
再按 i 进入插入模式(或按a 进入插入模式,这样会在光标当前字符的后面接着输入字符)
输入完成后,先按esc进入控制模式,然后输入:wq,保存文件并退出。
hello.c
#include <stdio.h>
int main(){printf("Hello World!"); return 0;}
想用cc编译hello.c是不行的,因为minix3上没有也不支持GCC,需要安装clang编译器
pkgin install clang 很重要!!!
pkgin install binutils 很重要!!!
clang hello.c -o hello
chmod +x hello
./hello
就打印出Hello World!了
===============================================================================================
minix3 开发环境搭建
https://blog.csdn.net/zouxiaoting/article/details/20464715?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-6.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-6.highlightwordscore
===============================================================================================
minix3下用clang编译C++版的helloworld
https://blog.csdn.net/weixin_30846599/article/details/94867205
# pwd
/home/c++_test
# clang++ -Wall -g -std=c++11 -stdlib=libc++ hello.cpp -o hello
# ./hello
hello world!#
clang 的错误提示是彩色的,所以便学着试用clang,由于他可以完美兼容g++,gcc,所以一些命令可以完美继承。
诞生原因,历史。。
关于llvm与clang的大致介绍 [http://blog.csdn.net/rangf/article/details/6977873]
关于apple与GNU的战争以及llvm诞生的背景 [http://www.programmer.com.cn/9436/]
一般编译c时
clang/gcc -Wall -g xxx.c -o xxx
编译c++
clang++ -Wall -g -std=c++11 -stdlib=libc++ hello.cpp -o hello 很重要!
clang++ -Wall -g -std=c++1y -stdlib=libc++ hello.cpp -o hello 【根据clang页面,Clang 3.4支持所有C++ 14语言功能(只要你使用-std = c ++ 1y标志).】
然后 ./hello 即可输出 hello world!
#注:mac中的动态链接库是以dylib作为后缀的。。
std指编译的标准,详见c++标准化协会xxx
-std=c++98
-std=c++03
-std=c++11
-std=c++0x
根据clang页面,Clang 3.4支持所有C++ 14语言功能(只要你使用-std = c ++ 1y标志).
===========================================================================================
参考资料:
GCC与LLVM-Clang的关系、区别
GCC:
GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。
GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。
LLvm-Clang:
LLVM(Low Level Virtual Machine)由APPLE公司的Chris Lattner1设计,即底层虚拟机,使用GCC作为前端来对用户程序进行语义分析产生IF(Intermidiate Format),然后LLVM使用分析结果完成代码优化和生成。
从宏观上来讲,LLVM不仅仅是一个编译器或者虚拟机,它是一个众多编译器工具及低级工具技术的统称,它包含了一个前端、优化器、后端以及众多的函数库和模板。
之后,出于各方面原因,比如gcc系统庞大而笨重,加之许可证方面开发者对Apple的要求等,故基于C++写了另一种编译器前端clang,编译速度为GCC的3倍左右,同时它还能针对用户发生的编译错误准确地给出建议。内存占用小,易于理解,希望更好地代替gcc,但其在很长一段时间内仅支持c语言,
clang和gcc的具体区别如下:
1.Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。
2.Clang比GCC的内存占用更小。
3.Clang生成的中间产物比GCC更小。
4.Clang的错误提示比GCC更加友好。
5.Clang有静态分析,GCC没有。
6.Clang使用BSD许可证,GCC使用GPL许可证。
7.Clang从一开始就被设计为一个API,允许它被源代码分析工具和IDE集成。GCC被构建成一个单一的静态编译器,这使得它非常难以被作为API并集成到其他工具中。
8.GCC比Clang支持更多的语言,例如Java。
9.GCC比Clang支持更多的平台。
10.GCC比Clang更流行。
参考文档链接:
【1】https://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html
【2】https://blog.csdn.net/shockyu/article/details/102793708
LLVM历史
Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。
一方面,是Apple对Objective-C语言(甚至后来对C语言)新增很多特性,但GCC开发者并不买Apple的帐——不给实现,因此索性后来两者分成两条分支分别开发,这也造成Apple的编译器版本远落后于GCC的官方版本。另一方面,GCC的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模块化的方式来调用GCC,但GCC一直不给做。甚至最近,《GCC运行环境豁免条款 (英文版)》从根本上限制了LLVM-GCC的开发。 所以,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,于是Apple请来了编译器高材生Chris Lattner(2000年,本科毕业的Chris Lattner像中国多数大学生一样,按部就班地考了GRE,最终前往UIUC(伊利诺伊大学厄巴纳香槟分校),开始了艰苦读计算机硕士和博士的生涯。在这阶段,他不仅周游美国各大景点,更是努力学习科学文化知识,翻烂了“龙书”(《Compilers: Principles, Techniques, and Tools》),成了GPA牛人【注:最终学分积4.0满分】,以及不断地研究探索关于编译器的未知领域,发表了一篇又一篇的论文,是中国传统观念里的“三好学生”。他的硕士毕业论文提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,直接奠定了LLVM的基础。LLVM在他念博士时更加成熟,使用GCC作为前端来对用户程序进行语义分析产生IF(Intermidiate Format),然后LLVM使用分析结果完成代码优化和生成。这项研究让他在2005年毕业时,成为小有名气的编译器专家,他也因此早早地被Apple相中,成为其编译器项目的骨干)。
刚进入Apple,Chris Lattner就大展身手:首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。如果显卡足够高级,这些代码会直接扔入GPU执行。但对于一些不支持全部OpenGL特性的显卡(比如当时的Intel GMA卡),LLVM则能够把这些指令优化成高效的CPU指令,使程序依然能够正常运行。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM的链接优化被直接加入到Apple的代码链接器上,而LLVM-GCC也被同步到使用GCC4代码。
=======================================================================================
参考资料:
请问LLVM与GCC之间的关系,网上说LLVM 是编译器的架构,在这个架构上可以搭建多个小编译器(类似C、C++/JAVA/),不知理解的对不对,还请高手补充?
xcode用的编译器应该是LLVM,他和GCC是什么关系,我调试用的时候底层掉的是gdb,费解
LLVM本身并不是编译器,只是一套用于开发编译器、解释器等程序语言相关工具的库,主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。
所 以说“XCode用的编译器是应该是LLVM”是不对的。XCode用的编译器是Clang。Clang是一个基于LLVM开发的C/C++/Obj-C 编译器,有一套独立的前端,后端直接采用LLVM。还有一个较为早期的相关项目LLVM-GCC,是一个将GCC的前端嫁接到LLVM之上拼接而成的一个 完整的编译器。
Clang自2.8版本起已经可以完整编译Boost了,可以说是Clang成为成熟C++编译器的一个标志。但当时Clang还没有调试器可用,只有一个尚未完成的只支持MacOS平台的LLDB(http://lldb.llvm.org/)。后来不知道是GDB支持了LLVM还是LLVM支持了GDB,总之Clang 3.0的编译产物已经可以用GDB调试了。
苹果之所以资助LLVM,主要原因在于GCC采用GPL协议而LLVM采用BSD协议。另外GCC官方对苹果提出的需求响应不及时,促使苹果急于寻求GCC的替代品。
————————————————
版权声明:本文为CSDN博主「iteye_10981」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iteye_10981/article/details/82572301