【gcc】
gcc编译过程:
hello.c(源文件)--[预处理-E]--hello.i(被修改的源文件)--[编译器-S]--hello.s(汇编程序)--[汇编器-c]--hello.o(可重定位目标程序)--[链接器]--hello(可执行程序)
【选项】
-o 产生目标文件(.i .o .s)
-c 通知gcc取消连接步骤,即编译源码并生成目标文件
-E 只运行c预编译器
-S 告诉编译器产生汇编语言文件后即停止编译
-Wall 对代码有问题的地方发出警告
-Idir 将dir目录加入搜索头文件的目录路径
-Ldir 将dir目录加入搜索库的目录路径
-llib连接lib库
-g在目标文件中嵌入调试信息,以便gdb之类的调试程序调用
【在vi编辑完成后输入crtl+s会导致终端卡死】
解决方法:crtl+q
【执行一个hello.c文件】
1:gcc -E hello.c -o hello.i //预处理
2:gcc -S hello.i -o hello.s //编译
3:gcc -c hello.s -o hello.o //汇编
4:gcc hello.o -o hello //连接
直接一步 gcc hello.c -o hello //直接编译连接成可执行目标文件,gcc -Wall hello.c -o hello会提示错误信息
gcc-c hello.c或gcc -c hello.c -o hello.o //直接编译成可重定位目标文件(只编译不连接)
【gcc编译多文件】
gcc -Wall hello.c main.c -o hello
如果只改变了main.c文件只需要将main.c编译成main.o 然后 gcc -Wall hello.o main.o -o hello
【实例】
建立一个新用户test5,指定用户的宿主目录为/home/test5
useradd -d /home/test5 test5
1编写一个程序 hello.c
2gcc hello.c 会生成 一个a.out
3执行./a.out(默认不会在当前目录)
如何让linux在当前目录下找到可执行程序
第一步,没有参数的cd命令,代表回到用户的宿主目录
cd
第二步,打开宿主目录下的.bash_profile文件
vi .bash_profile
第三步,在PATH后面加:.代表在当前目录下找可执行文件
第四步,vi保存退出
:wq
第五步,让.bash_profile生效
. .bash_profile
每个用户都有各自的.bash_profile,
Int main(int arg,char*args[]){} //arg表示参数个数,args表示参数
如a.out q //那么q为2,因为a.out也是一个参数
生成可执行文件之后:
ldd 文件名 可以查看调用到哪些库
nm 文件名 查看调用的方法
GCC默认只链接C的标准库,不链接C++的标准库
连接时加上 –l 是连接指定的库文件libstdc++.so
例:gcc hello.o –o hello –l stdc++
如果要链接多个库gcc hello.o –o hello –l库0 -l 库1 –l 库2 …
C++中编译后会将函数的名字改变,这就是为什么编译的时候链接不到C的库,要指明c++库,这也是c++重载的原理
【使用外部库】-l选项
-lm 表示要链接libm.so(共享库)或者libm.a(静态库)库文件
【静态库与共享库】:
【静态库.a】:程序在编译链接的时候把库的代码连接到可执行文件中,程序运行的时候将不再需要静态库
【共享库.sa或.so】:程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码
【生成静态库】
ar rcs libhello.a hello.o //ar是gnu归档工具,rcs表示(replace and create)
链接生成:gcc -Wall main.clibhello.a -o main或者gcc -Wall -L.main.o -o main -lhello(-L.表示是当前目录)
l:链接共享库,只要库名去掉lib和版本号
L:链接库所在路径
~/.bash_profile
【生成动态库】
【如何安装g++】
1. 在vm上linux右键选择设置
2. 选择CD/DVD ->使用ISO镜像挂载
3. 进入root根目录->media目录->cd RH*进入磁盘->cd Pack* 进入包->ls 可以看见所有安装包
4. 安装命令自行百度
5. g++ -v 查看安装