makefile编译

一、g++和gcc的区别

  1. 基本定义(参考AI让生活更美好
    gcc(GNU Compiler Collection)是一个编译器集合,最初是为C语言设计的,但现在它已经扩展支持包括C++、Fortran、Ada、Go、D等多种编程语言。g++是gcc的一部分,专门用于编译C++代码。
  2. 语法与用途
    尽管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文件如何去编写

  1. 了解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

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡蓝色的经典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值