gcc / g++分别是gnu的c / c++编译器, gcc/g++在执行编译工作的时候,总共需要4步:
预处理 -> 生成 .i 文件
编译 -> 汇编代码 .s文件
汇编 -> 有汇编变为目标代码 .o 文件
链接 -> 连接目标代码,生成可执行程序
参数:
- -E 只激活预处理(宏的替换和注释的消除),这个不生成文件,你需要把它重定向到一个输出文件里面.
g++ -E main.cpp > main.i
- -c 只做前三步, 不做链接, 生成 .o obj文件
g++ -c main.cpp
- -S 只做前两步, 生成 .s
g++ -S main.cpp
- -o 生成链接文件
单个源文件: g++ -o exec main.c
多个源文件: g++ -o exec main.c print.c
复杂依赖: 写MakeFile文件 然后执行 make 命令
-g 只是编译器,在编译的时候,产生调试信息。
-ggdb
此选项将尽可能的生成gdb的可以使用的调试信息.-static
此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行-fpic或-fPIC
产生位置无关的目标代码(因为是share),可用于构造共享函数库。
g++ -fPIC -c print.c
print.o 可以用于被创建共享函数库
-
-share
windows中动态链接库以.dll后缀为标记。动态链接库和净态链接库不同,它里面的函数并不是执行程序的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多的青睐。在Linux中同样有动态链接库,它们以.so为后缀,即shared object,共享对象。在Linux下创建动态链接库是件再简单不过的事情,只要在变异函数库员程序时加上-shared选项即可,这样所生成的执行程序即为动态链接库。从某种意义上说,动态链接库也是一种执行程序。按一般规则,程序名应带.so后缀。
gcc -shared -o dest src
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
共享函数库与静态函数库
gcc -shared -o print.so print.o
gcc -o main_share -lprint -L. print.o
- -include file
包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include<filename>
gcc hello.c -include /root/pianopan.h
-
-Ldir
将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录。在有多个-L选项的情况下,按命令行上-L选项的前后顺序搜索。dir可使用相对路径。如-L../lib等。
-Idir
在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
回先在你所制定的目录查找,然后再按常规的顺序去找.
对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-I-
就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir
在-I的目录里面查找失败,讲到这个目录里面查找.
关于函数库
(http://www.cnblogs.com/avril/archive/2010/05/16/1736524.html)
一个“程序函数库”简单说就是一个文件包含一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其它的程序
使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为三种类型:静态函数库--static libraries,共享函数库--shared libraries,和动态函数库--dynamic loaded libraries。静态函数库是在程序执行前就加入到目标程序中去了;而共享函数库则是在程序启动的时候加载到程序中,它可以被不同的程序共享;动态加载函数库则可以在程序运行的任何时候动态加载。实际上,动态函数库并非另外一种库函数模式,区别是动态函数库是如何被程序元使用的。
Linux系统上的函数库分为两种不同的类型:共享的和静态的
-
静态函数库
每次当应用程序和静态连接的函数库一起编译时,任何引用的库函数中的代码都会被直接包含进最终的二进制程序。
- 共享函数库
包含每个库函数的单一全局版本,它在所有应用程序之间共享。这一过程背后所涉及的机制相当复杂,但主要依靠的是现代计算机的虚拟内存能力,它允许包含库函数的物理内存安全地在多个独立用户程序之间共享
如何创建共享函数库:
未完
参考:
http://blog.sina.com.cn/s/blog_55a406730100rutb.html
http://www.cnblogs.com/shine-yr/p/5214875.html
http://www.cnblogs.com/avril/archive/2010/05/16/1736524.html