h //C/C++头文件
.c //C的源文件
.cc //C++ 的源文件
.cpp //C++ 的源文件
.cxx //C++ 的源文件
.i //gcc 编译的过程文件 使用 -save-temps 即可以保留过编译过程文件,用于分析编译过程
.s //汇编文件,gcc 编译的过程文件 使用 -save-temps 即可以保留过编译过程文件,用于分析编译过程
.a //Linux 下的静态文件在WINDOWS下为".lib"
.o //.obj文件 多个时,连接顺序从左到右搜索,gcc对同类型的文件连接时不区分顺序,GCC在连接时不同类型,需要区分顺序,遵守从左到右的顺序。
.so //share object ,动态库文件,在WINDOW下为"DLL"
文件编译顺序:
.c文件编译产生对应的.o文件,.o文件可以产生.a或.so文件。
eg:
gcc -c xxx.c //产生xxx.o
对ar命令可以产生.a文件
ar cr libxxx.a xxx.o
如果有多个.o来生成.a可以在后面空格隔开追回更多文件。
ar t libname.a
查看有多少个.o来生成的.a文件
gcc -shared -fpic xxx.o yyyy.o -o liblastfile.so
GCC编译时警告开关
-Wall //是警告的集合,详细包括:
-Wcomment(注释是否嵌套)
-Wformat(printf,scanf格式)
-Wunused(没有使用的变量)
-Wimplicit(没有实现)
-Wreturn-type(没有返回值)
eg:
gcc -Wall -c xxx.c
-o (小写)//output 指定输出文件名。
eg:
gcc -Wall -c xxx.c -o yyy
-v (小写)//Verbose 打印详细编译信息
eg:
gcc -v -Wall hello.c
-save-temps 把编译历史保存下来,供分析,产生.i,.s文件
eg:
gcc -Wall -save-temps xxxx.c
-I //用于连接头文件路径 读"哎"
eg:
gcc -Wall xxx.c -Iinclude -Llib //在xxx.c目录下有一个include放有xxx.h头文件,在lib文件夹下放库文件如.a
-L //(连接库路径) 用于对指定的路库路径进行搜索 最常见的是 "-L."其中的"."表示在当前目录
eg:
gcc -Wall xxx.c -Iinclude -Llib
-l //链接link 用于对库文件的链接,常见的库为libNAME.a 或libNAME.so,用于连接时,-lNAME
eg:
gcc xxx.o -lm -o out
-D 定义或使用宏-DNAME 或 -DNAME=VALUE
eg:
如源文件中用到一个宏为DF,但又没有声明哪么在使用的时候如果没有指定宏就会报错哪么可以使用这个-D来进行编译时声明
gcc -Wall -c -DDF xxx.c 或gcc -Wall -c -DDF="abc" xxxx.c
-E 查看预处理过程
-O 优化开关 级别有0-3
eg:
gcc -Wall -c -O2 xxx.c
更多命令查看gcc --help
其它Linux指令:
在Bash shell的命令行交互中可以输入很多命令运行。例如:
命令 | 说明 |
| 命令 | 说明 |
touch | 新建文件 |
| cmd | 切换到windows控制台,可以运行windows程序 |
rm | 删除文件 |
| --help | 参数,显示命令帮助 |
mkdir | 新建目录 |
| man | 显示命令帮助 |
rmdir | 删除目录 |
| info | 显示命令更详细帮助 |
ls | 显示文件和目录 |
| ps | 显示进程 |
cd | 改当前目录 cd / |
| echo | 输出变量值,echo $PATH |
cp | 复制文件 |
| find | 查找文件 |
mv | 移动文件 |
| diff | 比较文件差异 |
查看命令帮助文档时,按 Ctrl+Z 或 Ctrl+C 退出命令 |
cat 指令:用于查看文件
eg:
cat -n xxx.c 其中-n 用来显示行号
ldd 指令:用于查看可执行文件有哪些动态库依赖。
eg:
ldd xxxx
which 指令:用于查看指令本身所在库的目录
eg:
which gcc
显示 /usr/bin/gcc
ll指令:列出文件列表
eg:
ll /usr/lib/*.a 列出文件
pwd: 显示当前所在目录
当出现乱码时可以指定显示的语言
export LANG = C
evn 指令:显示当前用户的环境变量
eg:
evn | grep LIB //查看LIB开头的环境变量
su指令:
su 就是换到超级管理员操作
su- 就是指定切换到某个用户
cpp 指令:
cpp -dM /dev/null 查看宏
cpp 预处理
time 指令: 查看执行时间
eg:
time xxxx 其中xxxx为可执行程序名
GCC 编译时连接第三方头文件或库文件时指定搜索路径
经常在编译时产生ld:cannot fine xxx。或没有找到文件,大多情况下是因为没有正确找到库或头文件所致。
一、系统默路径搜索法。
//系统缺省头文件
/usr/local/include/
/usr/include/
系统缺省库文件
/usr/local/lib/
/usr/lib/
上面这几个是安装好之后缺省的头文件和库文件路径。里面放的是系统需要的头文件和库文件,如果我们使用第三方库时,也所以把第三方的库文件和头文件考过来,但这样做,日积月累就会有很多第三方的垃圾库。为了保证干净,使用环境变量和-I及-L参数进行动态设置。
二、环境变量法。
环境变量:可以查看(.bash_profile文件)
下面几个是常使用的命名环境变量(当然可以按个人习惯来命名)
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
LIBRARY_PATH
LD_LIBRARY_PATH
可以设置多个环境变量,每个环境变量之间用“:”号隔开,如:
export DIR1:DIR2:...
注意在指定环境变量时,尽量以追回的方式,以免复盖了别人的值。
eg:
export LIBRARY_PATH=/home/xxx //不推荐,因为这样有可能把这个变量从些就设置为/home/xxx
export LIBRARY_PATH=/home/xxx:$LIBRARY_PATH //推荐,因为这样可以在原有值的基础上进行添加。
三、使用-I(大写的哎)和-L
-I表示include的第一个字母,即搜索头文件(通常头文件都是include的,所以放在include文件夹下)
-L即(library)的第一个字母,即查找库文件,后面跟的是库的路径。
最后,GCC可以编译C/C++文件,但如果是C++的请使用G++进行编译,另外,不要用GCC编译用G++进行文件的链接,或G++编译使用GCC进行文件的链接,因为链接时找的运行时库不一样,所以很多情况下,找不到相应的库的头文件。