linux下编译C++代码之makefile
2017-03-06 17:15
901 查看
linux下编译C++代码之makefile
具体可参考这边博客:http://blog.csdn.net/ruglcc/article/details/7814546makefile文件书写规则
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下编译C++代码,makefile文件内容
- Linux makefile 编译c++ :undefined regerence to 'main'
- Linux工程下所有C代码编译Makefile模板
- 关于linux下无法用gcc编译c++代码的原因
- linux编译执行c++代码的方法
- 在Linux中使用VS Code编译调试C++项目(gcc/g++、Makefile入门、vs code)
- 使用CLion在MacOS、Linux上编译C++代码
- Linux下使用Eclipse编译C/C++代码时遇到问题的说明
- linux下使用Eclipse编译调试C++ makefile项目
- Linuxg++编译C++代码出错 -std=c++11 or -std=gnu++11
- 使用CLion在MacOS、Linux上编译C++代码
- 同一段C++代码在win下和linux下同时编译时产生的头文件包含问题及解决
- 关于linux下执行脚本编译C++:需要使用make命令和makefile
- mac os/Linux 下命令行C/C++/Java代码编译+运行方法
- Windows Eclipse编译调试Linux下的C++代码
- linux的ubuntu上如何编译C和C++代码写的动态库,以及调用执行
- [Android NDK]命令行编译C++代码(JNI)的方式(windows和linux通用)
- linux/Makefile 代码注释
- Windows下搭建类linux的GCC编译C,C++
- Linux下程式开发2 变量数据类型的代码以及编译&运算符与表达式