helloworld
1.
gcc test.c -o test
./test
2.
gcc test.c
./a.out
任何一个可执行程序从源码到可执行的二进制程序之间都要经过固定的几个步骤
编译步骤:
预编译 Pre-Processing 完成对预编译代码的处理
编译Compiling 将源代码编译成汇编代码
汇编Assembling 将汇编代码汇编成目标文件
链接Linking 将目标代码和所需的库的链接成一个完整的应用程序
集成开发环境(IDE)自动协助开发完成这几步,如VC++
在Linux 下,如果使用命令行开发工具(gcc,ld,ar)等,需要用户手
工调用这一些命令来完成这几步骤.
gcc在构建应用程序里,会调用不同的应用程序完成每一步.
gcc所做操作
– gcc 调用cpp进行预处理
– gcc 调用cc1进行编译,会生成汇编代码
– gcc 调用as 对汇编代码,生成扩展名为.o的目标文件
– gcc 调用ld 来完成对所有目标文件的链接.
源文件 预处理 编译 汇编 链接 可执行
注意: gcc编译时是对输入文件扩展名是敏感的,即.c一定会当做C 代码编译,.cpp,.C …一定会当成C++代码编译,这一点跟大部Linux 程序不一样
gcc的结果输出是后缀名不相关的.只与输出参数相关.这跟一般 Linux程序是一样gcc hello.c -o hello.o#虽然后缀名是.o ,但实际是 一个应用程序
gcc 选项
gcc 完整使用格式
gcc -c -s -e -o file -pipe -v language
g++ -c -s -e -o file -pipe -v language
language的可选值有
c’,
objective- c‘, c-header’,
c++‘, cpp-output’,
assembler‘,和 `assembler-with-cpp’。
-x none 就象是从未使用过`-x‘选项
-c编译或汇编源文件,但是不作连接
-s 相当于编译源码,只生汇编代码
-E生成预处理后的文件,默认后缀为.i
-Wall打开所有编译警告
-Werror视警告为错误;出现任何警告即放弃编译.
-g 产生调试信息
-strip hello 去掉调试信息
gcc 使用库 两大类库形式
– gcc foo.c -I /home/xiaowp/include -o foo 添加库编译-I
c/c++可以使用静态和动态两种库
– 静态库在链接时会把库目标代码与最终的可执行程序一起链
接到一个文件,这样相对尺寸较大.但处理简单.
– 而动态库是可执行程序在运行,动态加载到进程内存中去.动
态库与可执行程序是分离的两部分文件.
– 两者在作用是完全等效,主要是使用方法不同.由开发者根据
项目情况自行评估使用哪种形式.
Windows下的静态库是以 lib为后缀名的文件,而动态库是以DLL
为后缀名的文件.
Linux下的动态链接库是so为后缀,和静态链接库以.a为后缀名
形式动态库的执行
查看用了哪些动态库
win ldd libmyhello.so
mac otool -L libmyhello.so
gcc 参数区分大小写
gcc 代码优化
-On n表示优化级别 不同gcc版本 优化级别有所差异 一般0-2 or 3 数字越大,级别越高
-O 同时减小代码的长度和执行时间 = -O1
1