编译器:GCC / Clang

编译器架构:
理解Blog中:3、STL、ABI、UNWIND层次关系
这里写图片描述
http://blog.csdn.net/vloong/article/details/19070443
这里写图片描述
上图分析:
g++complier是g++编译的,先调用其标准库libstdc++(包含了libsupc++),而后标准库又依赖libgcc_s,往下又依赖libc.so;
clangcompiler是clang编译的,先调用libc++(STL层),而后libc++abi(ABI层),而后是libgcc_s, 往下又依赖libc.so;
重点:libc.so是什么库文件?
答案:glibc库编译后生产的库文件,是LINUX系统中最底层的API,几乎任何其余运行库都要依赖glibc,它最要是对系统调用进行封装(你怎么能在C代码中直接用fopen函数就能打开文件? 打开文件最终仍是要触发系统中的sys_open系统调用,而这中间的处理过程都是glibc来完成的),具体看此文:http://www.chongh.wiki/blog/2016/04/08/linux-syscalls/html

GCC中gcc与g++区别
GCC (Gnu Compiler Collection)(包括gcc/g++)
1.gcc 根据扩展名来自动检测调用c/c++的标准库
例如:若是源文件为.c,则连接时会调用c的标准库
若是源文件为.cpp,编译没问题,可是连接时,没法自动连接到libstdc++.so上(因此用gcc编译c++若是不指定连接的库,则会出错)
2.g++ 无论源文件为.c 仍是 .cpp ,则都将其做为.cpp源文件对待 ,编译阶段调用gcc来编译,连接阶段调用c++标准库(因此用g++编译c,会出错,没有连接到c的标准库)
< c和c++编译后造成的目标文件中的symbol表示不一样,而在连接阶段,连接器经过这些符号在连接器所连接的库文件中查找定位,故要一一对应才能生成可执行文件>
无论怎样,咱们编译源文件为.c,应该使用gcc;编译源文件为.cpp,应该使用g++
参考blog:
http://blog.chinaunix.net/uid-23023613-id-88201.htmllinux

glibc是GNU实现的libc,而libc是整个操做系统的基础lib,他封装了全部的系统调用,可是不限于系统调用,除了封装系统调用,glibc自身也提供了一些上层应用函数必要的功能,如string,malloc,stdlib,linuxthreads,locale,signal等等
http://www.chongh.wiki/blog/2016/05/25/lib-compile-link/(此Blog最后介绍更新gcc方法)
Linux系统调用权威指南
http://www.chongh.wiki/blog/2016/04/08/linux-syscalls/c++

编译器对头文件和库文件的查找:
1.程序在编译时,源码所须要的库(静态库和动态库)及头文件编译器是去哪找的?(库及头文件的查找)
2当输入一个命令时,系统时如何找到这个命令的?(命令的查找)
3.程序在运行时,它所须要的库是去哪找的?(动态连接库的查找)
参考:http://m.blog.csdn.net/article/details?id=6776936
注意:
gcc的inlcude查找不会到/usr/include/的第二级目录中查找,若是没有指明的话
clang 编译时指定:
clang -std=c++11 -libstd=libc++ -lc++ -lc++abi (其后添加源文件和输出文件)
编译参数的指定
-std = c++11 :指定c++11
-stdlib = <> : 指定头文件
-lxxx :指定连接时的库(编译器自动添加libxxx.so查找,libxxx.so通常为软连接)
软链接:
ln -s 被连接文件 连接文件(本生不存在,经过连接后生成)
注意,无论连接文件被移动到任何目录,访问连接文件就是访问建立连接时的被连接文件
好比:
在/home/zhyi/test/目录下存在A文件,建立软链接 ln -s A link,将生成link软连接文件,以后将link移动到任何目录,就好比移动到/usr/lib/下面,若是/usr/lib下面存在A文件,那么访问link文件也是指向/home/zhyi/test/目录下的A文件(就相似于一个别名)
-I (i 的大写):指定头文件查找目录
make -j n (指定n个进程编译)web