linux环境cpp/c文件的makefile编写(caffe举例)


编译单个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执行结果,可以看到是等价于直接编译语句的,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值