gcc编译器套件
gcc介绍
GNU编译器套件(GNUCompilerCollection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的后端linux ldd命令源代码,也包括了那些语言的库(如libstdc++、libgcj等等)。GCC的本意是为GNU操作系统专门编撰的一款编译器。GNU系统是彻底的自由软件。
1)gcc是一个可移植的编译器,支持多种硬件平台
2)gcc不仅仅是个本地编译器,它能够跨平台交叉编译。
3)gcc有多种语言后端,用于解析不同的语言。
4)gcc是按模块化设计的linux ldd命令源代码,可以加入新语言和新CPU构架的支持
5)gcc是自由软件
gcc常用编译选项
选项作用
-o形成目标(.i、.s、.o、可执行文件等)
-c通知gcc取消链接步骤,即编译源码并在最后生成目标文件
-E只运行C预编译器
-S告诉编译器形成汇编语言文件后停止编译,形成的汇编语言文件扩充名为.s
-Wall使gcc对源文件的代码有问题的地方发出警告
-Idir将dir目录加入搜索头文件的目录路径
-Ldir将dir目录加入搜索库的目录路径
-llib链接lib库
-g在目标文件中嵌入调试信息,便于gdb之类的调试程序调试
gcc编译过程
gcc-Ehello.c-ohello.i(预处理)
gcc-Shello.i-ohello.s(编译)//在这到之前生成下来的文件都是可以直接看见的
gcc-chello.s-ohello.o(汇编)//由汇编代码生成一个二补码文件
gcchello.o-ohello(链接)//此时这个hello是linux下的可执行文件
以上四个步骤,可合成一个步骤
gcchello.c-ohello(直接编译链接成可执行目标文件)
!gcc运行上一个gcc命令
gcc编译警告提示
#include
int main(void)
{
printf("2+1 is %f", 3);
return 0;
}
前面一段代码,编译可以通过,并且运行结果:
但是我们编译的时侯,没有给我们任何提示。
所以我们通常编译的时侯,须要加上-Wall命令
gcc编译多个文件
一次行编译
gcc 1.c 2.c -o hello
分多次编译
gcc -Wall -c 1.c -o mainf.o
gcc -Wall -c 2.c -o fun.o
gcc fun.o mainf.o -o hello//汇编,进行链接
之后就可以./hello运行得出结果
用脚本文件静态库生成而且链接
我的目录结构:
inc:储存的是.h文件
lib:储存的是生成的静态库.a文件
src:储存静态库函数
test:测试程序
script:上面是gcc编译命令以及一些其他命令(前面文章会用makefile取代)
须要chmod775script将script变为可执行文件
script内容:
#将myadd.c生成一个二进制文件,-I ./inc 代表从这个里面找头文件
gcc -c -Wall -I ./inc ./src/myadd.c -o myadd.o
#将myadd.o的二进制文件生成静态库,静态库文件名为libmyadd.a(为什么lib开头后面讲)
ar rcs libmyadd.a myadd.o
#删除.o结尾的文件,将静态库移动到lib目录下
rm *.o
mv libmyadd.a ./lib
*静态库名称通常为libXXX.a
这么我们调用这个静态库就要在结尾加上-lXXX
编译测试程序将静态库链接进来
gcc -Wall -L./lib -I ./inc ./test/main.c -o ./main.out -lmyadd
这个时侯,静态库会包含到main.out这个程序上面去,就可以不须要libmyadd.a这个静态库了
此时可以运行这个程序
nm命令
nm静态库名称
这个就可以查看到静态库上面的什么函数
生成动态库并链接1生成动态库
目录结构和里面的结构一样,这儿我们会将生成的动态库也放在lib目录下linux查看进程,此时不生成静态库
在script下的脚本
gcc -shared -fPIC -I ./inc ./src/myadd.c -o libmyadd.so
mv *so ./lib
shared:表示生成共享库格式
fPIC:形成位置无关码(positionindependentcode)
这个动态库,可在任何位置加载linux vi 命令,称作位置无关码。
这个动态库,在指定位置加载,成为与位置有关
这个时侯生成一个so文件动态库文件在lib目录下
2调用动态库
编译test下的测试程序
gcc -Wall -I ./inc -L ./lib ./test/main.c -o main -lmyadd
-L:指定动态库的位置
这个时侯我们调用main这个程序发觉报错:找不到动态库,默认/usr/lib
是由于系统不晓得我们这个库所在的目录
1我们通过cd命令步入桌面目录目录
2vi.bash_profile#这个文件是隐藏的,是环境变量,不同的用户不一样
添加如下:找寻当前目录和当前目录下的lib目录
3source.bash_profile刷新这个配置文件使配置文件生效
4运行成功
ldd命令
ldd命令:查看程序链接了库的位置
file命令
file文件名查看文件的属性