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,就差不多达到半自动化的效果了。