您的位置:首页 > 运维架构 > Linux

linux下编译C++代码之makefile

2017-03-06 17:15 901 查看

linux下编译C++代码之makefile

具体可参考这边博客:http://blog.csdn.net/ruglcc/article/details/7814546

makefile文件书写规则

makefile常用宏

makefile示例

遇到的问题以及解决方案

makefile文件书写规则

 目标 : 需要的条件 (注意冒号两边有空格)

    命令  (注意前面用tab键开头)

  解释一下:

  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。

  2 需要的条件就是生成目标所需要的文件或目标

  3 命令就是生成目标所需要执行的脚本

  总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。

  

  

makefile常用宏

$@ 表示目标文件

$< 表示第一个依赖文件

$^ 表示所有依赖文件

  

makefile示例

代码块语法遵循标准markdown代码,例如:

# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。
CC = g++
CFLAGS  := -Wall -O3 -std=c++0x

# opencv 头文件和lib路径
OPENCV_INC_ROOT = /usr/local/include/opencv2
OPEN_IN=/usr/local/include/opencv
OPENCV_LIB_ROOT = /usr/local/lib
SUPERLU_LIB_ROOT =/home/zhaoyu/cv/superlu_4.3/SuperLU_4.3/lib
SUPERLU_INC_ROOT =../inc
INCLUDE = ./
PY_INCLUDE = /home/zhaoyu/anaconda2/include/python2.7
OBJS = SGF-HOG-querytest.o GFHOG.o HogDetect.o BOWHistogram.o #.o文件与.cpp文件同名
LIB = review.so # 目标文件名

OPENCV_INC= -I $(OPENCV_INC_ROOT)

SUPERLU_INC = -I$(SUPERLU_INC_ROOT)

INCLUDE_PATH = $(OPENCV_INC)

LIB_PATH = -L $(OPENCV_LIB_ROOT)

SINCLUDE_PATH = $(SUPERLU_INC)

SLIB_PATH = -L $(SUPERLU_LIB_ROOT)

# 依赖的lib名称
OPENCV_LIB = -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core

SUPERLU_LIB = -lsuperlu_4.3
all : $(LIB)

# 2. 生成.o文件
SGF-HOG-querytest.o : SGF-HOG-querytest.cpp GFHOG.h BOWHistogram.h
$(CC) $(CFLAGS) -fPIC -c $< -fpermissive -o $@ $(INCLUDE_PATH) -I$(INCLUDE) -I$(PY_INCLUDE)
GFHOG.o : GFHOG.cpp GFHOG.h HogDetect.h
$(CC) $(CFLAGS) -fPIC -c $< -o $@ $(INCLUDE_PATH) $(SINCLUDE_PATH) -I$(INCLUDE)
HogDetect.o : HogDetect.cpp HogDetect.h
$(CC) $(CFLAGS) -fPIC -c $< -o $@ $(INCLUDE_PATH) -I$(INCLUDE)
BOWHistogram.o : BOWHistogram.cpp BOWHistogram.h
$(CC) $(CFLAGS) -fPIC -c $< -o $@ $(INCLUDE_PATH) -I$(INCLUDE) -I$(OPEN_IN)
# 3. 生成动态库文件
$(LIB) : $(OBJS)
rm -f $@
g++ -shared -fPIC -o $@ $^ $(LIB_PATH) $(OPENCV_LIB) $(SLIB_PATH) $(SUPERLU_LIB)
rm -f $^

tags :
ctags -R *
install :
cp review.so /home/zhaoyu/anaconda2/lib/python2.7/site-packages

# 4. 删除中间过程生成的文件
clean:
rm -f $(OBJS) $(LIB)
'''


遇到问题以及解决方案

1.编译.so文件时如果链接了.a文件,则需要在编译.a文件时添加-fPIC选项,使得动态库能够调用静态库

2.通常出现oserror都是在链接时找不到函数的声明或者函数的实现,细心查看一下makefile编写是否有误

3.linux下直接取一个未赋值的变量的地址通常会报错,这时候应该在编译时添加编译选项

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。

IE9以下不支持

IE9,10,11存在以下问题

不支持离线功能

IE9不支持文件导入导出

IE10不支持拖拽文件导入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux