欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GCC编译工具

程序员文章站 2022-07-14 13:10:19
...

示例代码如下,文件名: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//指定定义文件

GCC编译工具

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//报错,找不到头文件
    GCC编译工具
  • g++ main.cpp -o mian -I../Person //报错,找不到定义:
    GCC编译工具
  • g++ mian.cpp -o mian -I../Person -L../Person -lPerson
    大写i指定头文件路径,大写的L指定库文件路径,小写的l指定库文件名,生成可执行文件,执行./main,报错:因为没有指定可执行程序库文件的路径GCC编译工具
  • 解决方法:
    • 方法1. 把lib文件拷贝到系统的path路径下面;
    • 方法2. 可执行脚本的方式:export LD_LIBRARY_PATH=../Person,直接把path指定为动态库的路径,然后./mian就可以运行了,ldd mian可以看到链接的动态库有libPerson.so文件,是在…/Person下面找到的
相关标签: gcc c++