gcc的学习
gcc是由GNU开发的编程语言编译器,GNU的套件包括C、C++、Objective-C、Java、Ada和Go语言前端,也包含了这些语言的库(如libstdc++,libgcj等)
![](https://i-blog.csdnimg.cn/blog_migrate/f2f9c74665645e67c8cbe8c7c9addf41.png)
源码要经历预处理、编译、汇编和链接这四步才能生成可执行文件
代码:
gcc test.c -o app//生成app可执行文件
./app //在当前目录下执行app文件
gcc编译选项:
-E 预处理指定的源文件,不进行编译
-S 编译指定源文件,不进行汇编
-c 编译和汇编指定的源文件,不进行链接
-o 将文件编译成可执行文件
-I 指定include文件的搜索目录
-D 在程序编译时,指定一个宏
#include<stdio.h>
int main(){
#ifdef Debug
cout<<"111111"<<endl;
#endif
cout<<"hello";
return 0;
}
这时如果在编译时使用了
gcc test.c -o app -D Debug
则在输出hello的同时输出111111
gcc和g++的区别:
误区1:gcc只能编译c代码,g++只能编译cpp代码。事实上两者都可以
后缀为c:gcc认为是c,g++认为是cpp
后缀为cpp:都认为是cpp
在编译阶段,g++会调用gcc,因此在编译c时两者是一致的,但是对于cpp文件,gcc不能自动的和c++程序使用的库链接,通常用g++进行链接
误区2:gcc不会定义 __cplusplus宏,而g++会
事实上,这个宏只是标志着编译器将会把代码按照c还是cpp解释,如果.c文件使用gcc,则宏未定义,如果使用g++则宏定义
误区3:编译只能用gcc,链接只能用g++
严格来说,编译可以用gcc/g++,链接用g++/gcc -lstdc++,见误区1
静态库的制作
库文件可以看做代码仓库,提供给使用者一些可以直接拿来用的变量、函数和类
库不能单独运行
静态库在程序的链接阶段被复制到了程序中;动态库在程序运行时由系统动态加载
库的好处:代码保密、方便部署分发
命名规则
//linuxz中
libxxx.a
//windows中
libxxx.lib
静态库的制作:
step1:gcc获得.o文件
gcc -c add.c sub.c mult.c div.c
step2:使用ar工具将.o文件打包
ar rcs libxxx.a add.o sub.o mult.o div.o
//r:不存在就创建、存在就替换
//c:创建存档
//s:创建索引
创建时head头文件不需要打成.o文件,因为编译时会复制包含
但是必须要把库和head一起给用户,不然用户找不到head中的声明
静态库的使用
先需要把生成的静态库和head文件部署到对应文件夹
cp -r ../calc/libcalc.lib ./lib/
//把上级目录下calc目录中的libcalc.lib库复制到本层目录的lib目录下
./代表当前目录
../代表上层目录
/代表根目录
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
然后使用库
gcc main.c -o app -I ./include/ -l calc -L ./lib/
//-I指定main.c中#include 的查找范围,头文件可能和main.c不在一起
//-l 在程序编译时指定所用的库
//-L 指定库的路径,也可能和main.c不在一级目录下