gcc常用选项以及makefile的编写

gcc常用选项

选项意义
-o指定编译的文件的名称
-E预处理
-S编译
-c汇编(将源码转为汇编语言)
-l(小l)链接库
-L链接库的路径
-I(大i)头文件路径
-g调试
-O优化
-Wall打开警告
-D添加宏定义

最常用、最需要注意的选项

1. -o

用来指定编译获得的文件的名称

g++ -o mythreadpoll mythreandpoll.cpp -lpthread

在这里,我指定编译获得的二进制文件的名称位mythreadpoll,默认是out.a。

2. -l

在Linux系统编程的时候,如果我们使用了第三方库,我们就需要通过这个选项来连接第三方库,否则这个程序是没法编译的:

g++ -o mythreadpoll mythreandpoll.cpp -lpthread

在mythreadpoll.cpp中,我使用了头文件pthread,而这个文件属于第三方库,因此需要我们手动连接
-l+"需要连接的头文件的名字”。

3. 链接库的路径

如果这个库的位置不在系统的默认库位置中(/lib),我们就需要手动指定库的位置:

g++ -o mythreadpoll mythreandpoll.cpp -L/xfy/cpp -lpthread

这里就是告诉系统:这个库在/xfy/cpp中

4. 优化程序

上面提到了一个O选项,在洛谷做题的时候上面其实就有个选项:是否开启O优化,O后面跟上一个数字,表示优化程度,从O1~O3,O3优化程度最高。

makefile的编写

makefile是gcc提供的,便于我们对代码进行编译的一个……文件?我们在编写好makefile之后,只需在终端中输入make这类的指令即可完成对程序的编译。

makefile的名字

一般来说编写的makefile就叫Makefile,如果不叫这个名字,我们在make的时候可以指定名字:

make -f MF
# 此处我的makefile文件叫做MF

在使用make对文件进行编译之后,如果对比文件的生成时间发现生成的out文件不是最新的,将会重新编译

代码举例

现在我有三个文件,分别是main.cpp、printhello.cpp、factorial.cpp,要将他们编译,生成一个名叫hello的文件

版本1:
# 注释
hello: main.cpp printhello.cpp factorial.cpp
	g++ -o hello main.cpp printhello.cpp factorial.cpp

第一行:hello是目标,目标依赖于后面的文件
第二行:Tab不能少,写指令

版本2:
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

$(TARGET) : $(OBJ)
	$(CXX) -o $(TARGET) $(OBJ)

main.o: main.cpp
	$(CXX) -c main.cpp

printhello.o: printhello.cpp
	$(CXX) -c printhello.cpp

factorial.o: factorial.cpp
	$(CXX) -c factorial.cpp
版本3:
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

CXXFLAGS = -c -Wall
# -Wall就是打开所有警告,包括低级警告

$(TARGET) : $(OBJ)
	$(CXX) -o $@ $^
	# $@就是$(TARGET)
	# $^就是$(OBJ),是所有的依赖文件

%.o : %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@
	# $<是上面的第一个依赖文件

.PHONY: clean
# 防止存在一个叫clean的文件
clean:
	rm -f *.o $(TARGET)
版本4:
CXX = g++
TARGET = hello
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))

CXXFLAGS = -c -Wall

$(TARGET) : $(OBJ)
	$(CXX) -o $@ $^

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	rm -f *.o $(TARGET)

通过版本的不断迭代,这个makefile的自动化程序越来越高,到了版本4,就差不多达到半自动化的效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

默示MoS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值