gcc语法简介
gcc (-c) hello.c world.c -o main
-c表示只编译不链接
-o目标文件
此外,还有-I(大写的I)表示给gcc添加自定义的头文件的路径
-L表示给gcc添加额外的搜索库的路径
-g选项的意义是“生成调试信息,该程序可以被调试器调试”
这个时候发现的问题是如果有很多的源码以及库文件,在编译的时候需要执行很长的命令。因此,引入了make工具
构建项目
新建,项目文件夹hello,及文件main.cpp,factorial.cpp,printhello.cpp,functions.h。
hello目录的结构如下:
hello/
├──main.cpp
├──factorial.cpp
├──printhello.cpp
└──functions.h
main.cpp
#define _FUNCTIONS_H_
#include <iostream>
#include "functions.h"
using namespace std;
int main()
{
printhello();
cout << "This is main:" << endl;
cout << "The factorial of 5 is:" << factorial(5) << endl;
return 0;
}
factorial.cpp
#include "functions.h"
int factorial(int n)
{
if (n==1)
return 1;
else
return n * factorial(n-1);
}
printhello.cpp
#include <iostream>
#include "functions.h"
using namespace std;
void printhello()
{
int i;
cout << "Hello World!" << endl;
}
functions.h
#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int factorial(int n);
#endif
使用g++命令直接编译、运行
g++ main.cpp factorial.cpp printhello.cpp -o main
./main
使用makefile
version1
hello: main.cpp printhello.cpp factorial.cpp
g++ -o hello main.cpp printhello.cpp factorial.cpp
其中,冒号前的hello是目标,:main.cpp printhello.cpp factorial.cpp
后的是依赖。表示hello目标的生成需要依赖于main.cpp printhello.cpp factorial.cpp
。hello通过 g++ -o hello main.cpp printhello.cpp factorial.cpp
这条命令来生成。
执行make
的时候会去在当前目录下找hello,如果没有的话,会通过命令g++ -o hello main.cpp printhello.cpp factorial.cpp
去生成。
再次make如果提醒make: ‘hello’ is up to date。是因为ll可以看到hello比main.cpp printhello.cpp factorial.cpp这几个文件要新。如果main.cpp printhello.cpp factorial.cpp任何文件有改动,再执行make的话会去重新生成hello文件。
Version 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
依次去找TARGET发现没有,去找OBJ发现没有。然后去找main.o、printhello.o、factorial.o,执行对应的命令,最后执行 $(CXX) -o $(TARGET) $(OBJ)
。
修改其中一个依赖文件。eg.main.cpp使得此时main.cpp最新。
此时只会重新编译main.cpp:
Version 3
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
CXXFLAGS = -c -Wall
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(TARGET)
$@ 表示目标,$^表示所有依赖文件。$<表示第一个依赖文件。
打印warnig因为加入了CXXFLAGS = -c -Wall
Version 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)
指定文件名
make -f makerules.mk
默认的文件名是Makefile,大写的M。
调试信息的打印
$(warning "the OS is$(VERSION)")
$(info "the OS is$(VERSION)")
$(error "the OS is$(VERSION)")
其中,error会停在打印的地方。
makefile中的ifdef
ifdef hhh
$(info hahah)
endif
执行的时候可以通过make hhh=1
这种来进行定义
注意,这里的$(info hahah)是顶格的,没有Tab键。