***gcc是C编译器;
***g++是C++编译器;
***linux下cc一般是一个符号连接,指向gcc
***gcc说明
1.gcc编译常用格式:
gcc C源文件 -o 目标文件
或
gcc -o 目标文件 C源文件
或
gcc C源文件
最后一种情况产生的目标文件默认为a.out
2.gcc总体参数
-c 只是编译不链接,生成目标文件
-S 只是编译不汇编,生成汇编代码
-E 只进行预编译
-g 在可执行文件中包含调试信息(与下一篇的必须命令)
-o file 把输出文件输出到file中
-v 显示gcc的版本信息
-I dir 在头文件的搜索路径中添加dir目录
-L dir 在库文件的路径列表中添加dir目录
-static 链接静态库
-library 连接名问library的库文件
3.gcc生成库流程
gcc指令的一般格式如下:
gcc [参数] 要编译的文件 [参数] [目标文件]
gcc编译流程:
源代码(.c)->预处理(Pre-Processing)->编译(Compiling)->汇编(Assembing)->链接(Linking)->可执行文件
具体命令如下:
c文件用gcc的"-E"参数预处理,生成预处理“.i”文件,用gcc的“-S”参数编译,生成汇编“.s"文件,再用gcc的”-c“参数汇编,生成二进制”.o“文件,最后再用一次gcc把”.o“文件和一些链接库文件链接成可执行文件。
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:
例:
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib
多个文件合并创造一个程序时,就要再-o后,写上多个文件的文件名
例:
gcc -o json cJSON.c test.c
GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名
gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什
么意思:))一般c程序就用gcc编译,c++程序就用g++编译
2。gcc的基本用法
gcc test.c这样将编译出一个名为a.out的程序
gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名
字
3。为什么会出现undefined reference to 'xxxxx'错误?
首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本
身没有问题,是你用编译器编译时参数用得不对,你没
有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译
参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。
4。-l参数和-L参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文
件名有什么关系呢?
就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的
头lib和尾.so去掉就是库名了。
好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫lib
test.so,那么我们只要把libtest.so拷贝到/usr/lib
里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里
的函数,我们还需要与libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件
没放在这三个目录里,而是放在其他目录里,这时我们