GCC编译工具
示例代码如下,文件名:main.c
#include <stdio.h>
int main()
{
printf("hello lee.\n");
return 0;
}
1. GCC参数讲解
参数:-o
gcc main.c -o main -> -o参数表示输出文件
参数:-c只编译不链接
,做大项目的时候只针对一个文件进行编译,同时避免每次都链接
gcc -c main.c -o ->生成.o文件
gcc main.o -o main ->链接,生成可执行文件
注: 编译的时候是不需要指定库文件的路径(不考虑);在链接的时候处理,可以把不同的参数分开在不同的地方进行处理
参数:-E
预处理:只做预处理
,宏定义与头文件的替换
gcc -E main.c -o main.i -> 生成.i文件
参数:-S
编译:只编译,不汇编
,区别-c只编译不链接
gcc -S main.i -o main.s -> 生成.s文件(汇编代码)
参数:-c
汇编:只编译不链接
gcc -c main.s -o main.o -> 生成二进制文件,不进行链接
参数:-d
生成调试信息,对应Debug版本,不指定默认位Release版本
gcc -d main.c -o main -> 生成带有调试信息的二进制文件
2. GCC多文件编译
https://blog.csdn.net/deeplan_1994/article/details/82892572
示例代码如下,文件名:main.cpp(c++)
#include <iostream>
#include "Person.h"//大小写敏感
using namespacing std;
int main(int argc,char *argv[])
{
Person person;
cout << "test g++ .\n" << endl;
return 0;
}
main.cpp同级目录下新建文件家Person,建立以下Person类文件
Person类定义代码如下,文件名Person.cpp
#include "Person.h"
#include <stdio.h>
class Person::Person(){
printf("test Person"\n);
}
Person类申明代码如下,文件名Person.h
class Person
{
Person();
};
g++ Person.cpp -o Person//(gcc Person.cpp)如果是在单独的文件家里面,没有main是会报错的,因为最后需要链接到唯一的main函数
g++ mian.c//也会报错,因为找不到头文件,需要指定头文件的路径
g++ mian.cpp -o main -I../Person.h//大写的i指定头文件的路径,还是会报错,找不到定义
g++ main.cpp ../Person/Person.cpp -o main -I../Person.h//指定定义文件
3. GCC静态编译
linux上面的静态库比较简单,区别windows,linux下的.o文件就可以相当于一个静态库
如果把一个程序直接编译成静态库,就会把所有引用到的系统文件都编译成静态库,全部编到可执行文件中,
iostream stdio实际上会链接很多系统库,c++有std stl库,这些库不会编译进去,所以执行程序很小,当把这些库都编进去就会变得很大,但是执行的时候是在特定环境下,这个环境下面是包含动态库的,所以可以直接执行。
动态编译(链接动态库):
g++ mian.cpp -o main
ldd main //查看可执行程序所引用的所有的库
静态编译:
g++ mian.cpp -o main_static -static
ldd main_static //查看是没有动态库的引用,文件变得很大,编译时间长,因为需要拷贝库文件,造成运行简单,编译复杂
4. GCC动态库编译和调用
g++ Person.cpp -fpic -shared -o libPerson.so//->生成libPerson.so
- -fpic表示Person里面的函数与代码位置不相关,通过名字就能找到函数所在的位置
- -shared表示需要生成一个动态链接库
- 名称必须lib+“库名”+.so,引用库的时候只需要写Person就行了
-
静态库生成后,开始编译,g++ main.cpp -o main
//报错,找不到头文件
-
g++ main.cpp -o mian -I../Person
//报错,找不到定义:
-
g++ mian.cpp -o mian -I../Person -L../Person -lPerson
大写i指定头文件路径,大写的L指定库文件路径,小写的l指定库文件名
,生成可执行文件,执行./main,报错:因为没有指定可执行程序库文件的路径 - 解决方法:
- 方法1. 把lib文件拷贝到系统的path路径下面;
- 方法2. 可执行脚本的方式:
export LD_LIBRARY_PATH=../Person
,直接把path指定为动态库的路径,然后./mian就可以运行了,ldd mian
可以看到链接的动态库有libPerson.so文件,是在…/Person下面找到的
上一篇: 哔哩哔哩20校招算法笔试题(2019.8.20)第二道编程题 AC
下一篇: GNU-GCC编译选项