编译单个cpp文件
方法一、g++ 文件名.cpp,生成一个名为 “文件名.out” 的可执行文件
方法二、g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 “新文件名” 的.o文件
g++ 文件名.o -o 新文件名:生成一个名为 “新文件名” 的可执行文件
两种方法本质上是一样的。最后执行 ./可执行文件名如 ./a.out 即可执行程序
多个文件编译
main.cpp
#include "stdio.h"
#include "inc.h"
int main()
{
int a = 1; int b = 2;
printf("%d\n",add(a,b));
return 0;
}
inc.cpp
int add(int a,int b)
{
return a+b;
}
g++ -c main.cpp -o main.o
g++ -c inc.cpp -o inc.o
g++ main.o inc.o -o main
./main
编译步骤:
.cpp分开编译成.o文件 + .o文件一起编译成可执行文件 + 运行可执行文件
Makefile编写
比较复杂的编译环境,都是利用makefile编译文件,更复杂的比如跨平台编译又会用到cmake,下面通过例子说明makefile的编写步骤。
下面这段代码是我测试caffe blob的demo,程序很简单,代码内容就不说了,主要说makefile
#include <vector>
#include <iostream>
#include <stdio.h>
#include <caffe/blob.hpp>
using namespace caffe;
using namespace std;
int main()
{
Blob<float> a;
cout<<"size before reshape:"<<a.shape_string()<<endl;
a.Reshape(1,2,3,4);
cout<<"size after reshape:"<<a.shape_string()<<endl;
return 0;
}
先从直接编译文件开始,便是下面这段代码,一句一句说:
g++ blob_demo.cpp -I ../../caffe/include/ -D CPU_ONLY -I ../../caffe/.build_release/src/ -L ../../caffe/build/lib/ -lcaffe
1、g++ blob_demo.cpp 上面介绍过,再写一遍,等价于两句话:
1)g++ -c demo.cpp -o demo.o 源文件编译生成.o文件
2)g++ demo.o -o compile.out .o文件编译成可执行文件
2、由于包含了第三方库,所以要添加外部依赖库,包括头文件,及lib文件
-I ../../caffe/include/ 规定头文件的包含依赖路径以-I开头
-L ../../caffe/build/lib/ -lcaffe 规定库文件依赖路径以-L开头,有时还需要库名字,用 -l 指定连接时期望连接的库的名字
-D CPU_ONLY Makefile中用宏定义进行条件编译,指定cpu运行
等价的makefile文件:
OBJPATH = ./
SRCPATH = ./
CXX_SRC := $(wildcard $(SRCPATH)*.cpp) //获得SRCPATH文件夹下的所有.cpp文件名,包含路径
SRC_CXX := $(notdir $(CXX_SRC)) //去掉路径,只留下.cpp名
CXX_OBJ := $(patsubst %.cpp,%.o,$(SRC_CXX)) //将cpp替换为o
OBJS := $(patsubst %,$(OBJPATH)%, $(CXX_OBJ)) //为.o文件加上路径,说明.o文件生成的位置
LOCAL_INC = -I ../../caffe/include/ //.h文件依赖路径
CAFFE_INC = -I ../../caffe/.build_release/src/
INCLUDE = $(LOCAL_INC) $(CAFFE_INC)
LIBDIR = -L ../../caffe/build/lib/ -lcaffe //库文件依赖路径
.PHONY: exe_t //执行make时,会默认从第一个PHONY开始执行,除非make指定
exe_t: $(OBJS) //冒号后面是依赖项,需要依赖.o文件,便去找
g++ $^ -o compile.out $(LIBDIR) $^--所有依赖文件
$(OBJPATH)%.o: $(SRCPATH)%.cpp //规定.o文件的生成规则,即.cpp生成.o文件,之后exe_t便可以执行了
g++ -c $< -o $@ -D CPU_ONLY $(INCLUDE) //$<--第一个依赖文件 $@--目标文件
.PHONY: clean //执行make clean清除obj文件及.out文件
clean:
rm ./*.o -f
rm ./*.out -f
.PHONY: test //执行make test运行可执行文件
test:
./compile.out
makefile执行结果,可以看到是等价于直接编译语句的,