一、g++和gcc的区别
- 基本定义(参考AI让生活更美好)
gcc(GNU Compiler Collection)是一个编译器集合,最初是为C语言设计的,但现在它已经扩展支持包括C++、Fortran、Ada、Go、D等多种编程语言。g++是gcc的一部分,专门用于编译C++代码。 - 语法与用途
尽管g++和gcc都可以用来编译C++代码,但它们的使用方式和默认行为有所不同。
2.1 gcc:在默认情况下,gcc将代码视为C代码进行编译。如果要编译C++代码,必须使用-x c++或-lstdc++等选项来显式指定。
2.2 g++:g++自动识别并编译C++代码,提供了对C++语言特性的更好支持,比如模板和异常处理。
# 使用gcc编译C++代码,需要显示指定
gcc -x C++ -o main main.cpp
# 使用g++编译C++代码,自动识别
g++ -o main main.cpp
3.链接器行为
gcc:编译C++代码时,不会自动链接C++标准库(libstdc++),需要手动链接选项
g++: 自动链接C++标准库,简化了编译和链接过程
# 使用gcc编译和链接C++代码,需要手动链接标准库
gcc -o my_program my_program.cpp -lstdc++
# 使用g++编译和链接C++代码,自动链接标准库
g++ -o my_program my_program.cpp
4.代码混编
在涉及到C++和C语言代码需要混合编译的情况,首先要明确C代码和C++代码,在编译好C和CPP代码之后,在一起链接(在了解编译的时候,首先要了解程序运行的阶段预编译-编译-汇编-链接-生成可执行程序每一个阶段的过程)。
# 编译C代码
gcc -c my_c_code.c -o my_c_code.o
# 编译C++代码
g++ -c my_cpp_code.cpp -o my_cpp_code.o
# 链接生成最终可执行文件
g++ -o my_program my_c_code.o my_cpp_code.o
二、Linux下静态库和动态库
1.什么是库:库相当于封装了函数与数据,提供给用户去调用,库是在编译时期形式,没有到链接这一步。库可以使程序模块化,提高编程速度,实现代码复用。
WIndows(静态库:.lib、动态库:.dll)
Linux(静态库:.a、动态库:.so)
2.动态库和静态库的区别(这里不做过多赘述): link
三、makefile文件如何去编写
- 了解makefile文件
makefile是一个用于自动化构建和管理项目的文件,通常与make工具一起使用。它定义了一系列的规则和依赖关系,告诉make如何从源代码生成可执行文件或其他目标。makefile主要功能包括:
1.1定义目标:指定要生成的文件
1.2依赖关系:列出目标文件所依赖的源文件或其他目标文件
1.3构建规则:定义如何从依赖文件生成目标文件的命令
1.4变量:使用变量来简化和重用命令和文件名
2.使用方法:参考: link
第一版:
注:-c 只允许执行到汇编阶段,不允许链接
第二版:
# OBJS 代替 依赖文件
# cc 代替gcc
# CFLAGS 代替 编译命令
OBJS=add.o mul.o main.o
cc=gcc
CFLAGS=-c
all:main
main:$(OBJS)
$(cc) $(OBJS) -o main
add.o:add.c
$(cc) $(CFLAGS) add.c
mul.o:mul.c
$(cc) $(CFLAGS) mul.c
main.o:main.c
$(cc) $(CFLAGS) main.c
clean:
rm -rf *.o main
第三版:
# OBJS 代替 依赖文件
# cc 代替gcc
# CFLAGS 代替 编译命令
OBJS=add.o mul.o main.o
cc=gcc
CFLAGS=-c
all:main
main:$(OBJS)
$(cc) $^ -o main
%.o:%.c
$(cc) $^ $(CFLAGS) -o $@
clean:
rm -rf *.o main
makefile语法:
$@:在规则的命令中,表示规则中的目标。
$^: 在规则的命令中,表示所有依赖条件。组成一个列表,以空格隔开,如果这个列表中有重复项,则去重
$<:在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
推荐一篇写的很好的makefile文章: link