• 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

  • 相关阅读:
    [HDU 2089]不要62
    [WC 2011]Xor
    [BJOI 2011]元素
    [NOIp 2014]解方程
    [UVa 1326]Jurassic Remains
    [BZOJ 2152]聪聪可可
    [IOI 2011]Race
    [测试题]打地鼠
    [POJ 2828]Buy Tickets
    [测试题]gene
  • 原文地址:https://www.cnblogs.com/Thermo/p/15710386.html
Copyright © 2020-2023  润新知