ubuntu16.04下Cmake学习一
根据网上的资料,我总结了一下,一个工程应该有根目录(bin)存放可执行文件,头文件目录(include)存放头文件,源码文件(src)存放你的算法,还需要一个库文件夹存放你编译的静态库或者动态库。然后得出下面这个例子:
工程文件目录创建
/home/bmi-zc/project:
|—CMakeLists.txt 顶层CMakeLists
|
|—bin
|
|—include
| test.h
|
|—lib
|
|—src
| CMakeLists.txt
|
|—main
| CMakeLists.txt
| main.c
|
|—test
CMakeLists.txt
test1.c
test2.c
程序清单
test.h
#ifndef INCLUDE_TEST_H
#define INCLUDE_TEST_H
void t1();
void t2();
#endif /*INCLUDE_TEST_H*/
test1.c
#include "/home/bmi-zc/project/include/test.h"
#include <stdio.h>
void t1()
{
printf("this is t1()\n");
}
test2.c
#include "/home/bmi-zc/project/include/test.h"
#include <stdio.h>
void t2()
{
printf("this is t2()\n");
}
main.c:
#include "/home/bmi-zc/project/include/test.h"
int main()
{
t1();
t2();
return 0;
}
多目录多文件CMakeLists.txt
1 . 顶层CMakeLists.txt
/home/bmi-zc/project/CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
PROJECT(TEST)
ADD_SUBDIRECTORY(src)
CMakeLists.txt内容:指定项目名称,添加工程源码子目录(子目录里面还有目录,只需要把源码根目录添加进去就行,例如上图,只需要添加src目录ADD_SUBDIRECTORY(src)
即可)。
用到的指令:PROJECT,ADD_SUBDIRECTORY。
- 指定CMake的最低版本
cmake_minimum_required(VERSION 3.5)
不添加这一句并不影响整个cmake的过程,但是cmake会建议你加上这一句。 - project命令
project(项目名称)
例子:PROJECT(TEST)
系统预定义变量PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR。
PROJECT_SOURCE就是项目的根目录,例如;头文件include目录路径可以表示为:
${PROJECT_SOURCE_DIR}/include ,其中PROJECT是可以换为项目名称TEST的。建议使用PROJECT_SOURCE_DIR。
若使用“项目名称“_SOURCE_DIR,一旦项目名称更改,所有对应的名称也要更改。 - ADD_SUBDIRECTORY命令
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
例子:ADD_SUBDIRECTORY(src bin)
这个指令用于向当前工程添加存放源文件目录下的子目录(源码存放在src目录,需要自己提前创建src,并把源码放进去),并可以指定中间二进制和目标二进制存放的位置(bin目录,系统自己会创建)。
EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除。比如,工程的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建。
2. 源码目录下顶层CMakeLists.txt
/home/bmi-zc/project/src/
ADD_SUBDIRECTORY(main)
ADD_SUBDIRECTORY(test)
CMakeLists.txt内容:添加源码子目录
所用到指令:ADD_SUBDIRECTORY
3. 源码子目录(算法目录)CMakeLists.txt
/home/bmi-zc/project/src/test/
SET(CMAKE_C_COMPTLER GCC)
SET(SRC_LIST test1.c test2.c)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
ADD_LIBRARY(libtest STATIC ${SRC_LIST})
CMakeLists.txt内容:设置编辑器,添加头文件路径,设置lib输出目录,生成静态链接库
- SET命令
SET(CMAKE_INSTALL_PREFIX /usr/local)
指令含义(类似宏定义):路径/usr/local用CMAKE_INSTALL_PREFIX来代替
SET(VAR[VALUE][CACHE TYPE DOCSTRING[FORCE]])指令,将所有文件组合成一股列表清单,例如:SET(SRC_LIST main.c test.c p.c)。
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)把静态链接库的结果生成到/home/bmi-zc/peoject/lib中 - INCLUDE_DIRECTORIES
例子:INCLUDE_DIRECTORIES( ../include)
INCLUDE_DIRECTORIES类似gcc中的编译参数“-I”,指定编译过程中编译器搜索头文件的路径。当项目需要的头文件不在系统默认的搜索路径时,需要指定该路径。在我们的项目中,test1,test2所需的头文件都存放在${TEST_SOURCE_DIR}/include下。 - ADD_LIBRARY
ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
生成静态链接库或动态库
例子:ADD_LIBRARY(libtest STATIC ${SRC_LIST})
/home/bmi-zc/project/src/main
SET(SRC_LIST main.c)
INCLUDE_DIRECTORIES(${TEST_SOURCE_DIR}/include)
SET(EXECUTABLE_OUTPUT_PATH ${TEST_SOURCE_DIR}/bin)
ADD_EXECUTABLE(main ${SRC_LIST})
link_directories(${TEST_SOURCE_DIR}/lib)
TARGET_LINK_LIBRARIES(main libtest)
CMakeLists.txt内容:整理代码清单,头文件目录,可执行文件输出路径,静态库链接路径,链接静态库。
- ADD_EXECUTABLE
生成可执行文件,ADD_EXECUTABLE(main ${SRC_LIST}),执行文件名字叫main。SRC_LIST为编译清单。 - link_directories
添加静态链接库路径,${TEST_SOURCE_DIR}/lib为路径等同于/home/bmi-zc/project/lib。 - TARGET_LINK_LIBRARIES
将静态库添加到可执行文件中,
TARGET_LINK_LIBRARIES(main libtest),main为可执行文件,libtest为静态库的名字,注意要和之前创建的静态库名字一样。
编译
回到工程根目录,/home/bmi-zc/project
cmake .
make
进入bin文件夹,执行main可执行文件
cd bin
./main
分享推送
- 常用命令详情请参考对应CMake版本
- 比较好的3篇关于Cmake的博文:
1 . 关于cmake的使用总结,发布于2013年11月。
https://www.mawenbao.com/note/cmake.html
2 . 关于cmake入门实战,发布于2013年12月。
http://hahack.com/codes/cmake/
3 . 关于cmake的命令和一下命令例子,发布于2014年11月
http://blog.csdn.net/wzzfeitian/article/details/40963457/
ubuntu16.04下Cmake学习一的更多相关文章
- docker学习笔记(一)—— ubuntu16.04下安装docker
docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...
- 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案
本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进 ...
- Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)
Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...
- ubuntu16.04系统深度学习开发环境、常用软件环境(如vscode、wine QQ、 360wifi驱动(第三代暂无))搭建相关资料
事后补充比较全面的(找对资料真的省一半功夫):https://www.jianshu.com/p/5b708817f5d8?from=groupmessage Ubuntu16.04 + 1080Ti ...
- ubuntu16.04下安装artoolkit5
目前对AR技术的常见理解就是CV(Computer Vision)+CG(Computer Graphic).CV的方法很多,简单些比如FREAK+ICP(ARToolKit中的NFT),复杂些就是S ...
- Ubuntu16.04下编译安装及运行单目ORBSLAM2
官网有源代码和配置教程,地址是 https://github.com/raulmur/ORB_SLAM2 1 安装必要工具 首先,有两个工具是需要提前安装的.即cmake和Git. sudo apt- ...
- Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
目录 Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法 安装过程 1. 深度学习环境Tensorflow的安装 2. 安装python包 3. ...
- Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 说在前面的话 首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...
- ubuntu16.04下笔记本自带摄像头编译运行PTAM
ubuntu16.04下笔记本自带摄像头编译运行PTAM 转载请注明链接:https://i.cnblogs.com/EditPosts.aspx?postid=9014147 个人邮箱:feifan ...
随机推荐
- 【06】next() 伪函数
串行,第一个完成后,去执行第二个第二个异步任务,使用next()尾函数.首先我么想完成三个任务,task1,task2,task3,如图: 实现方式1: var fs = require(" ...
- Python Challenge 第十一关
第十一关,一张模糊的图,题目为 odd even,源代码中也没任何提示,看来又是图像处理. 这张模糊的图看起来没什么头绪,但是题目给了个奇数和偶数,就先试试坐标吧,根据原图来生成一个新图.我第一次尝试 ...
- Notepad++ 自动补全,括号自动完成插件,主题和字体设置
Notepad++ 自动补全成对符号http://rabbit52.com/2012/devel/notepad-autocomplete-brackets QuickText 和 Zen Codin ...
- 慎用lodash的cloneDeep函数
lodash的cloneDeep函数能够很方便的拷贝对象,但是一旦拷贝一些很复杂的对象就有可能报错.比如用cloneDeep克隆一个vue实例,就有可能包key.charAt is not a Fun ...
- 牛客网 牛客小白月赛2 G.文
G.文 链接:https://www.nowcoder.com/acm/contest/86/G 这个题wa了一发,有点智障,浮点数,式子里面要*1.0,忘了,然后wa了,改了就过了(脑子有坑) 代码 ...
- 牛客网 牛客小白月赛1 E.圆与三角形-公式题
E.圆与三角形 链接:https://www.nowcoder.com/acm/contest/85/E来源:牛客网 这个题把公式推一下, 发现就是1+sinA*r,sinA最大为1,所以 ...
- Codeforces Gym101063 J.The Keys (2016 USP-ICMC)
J.The Keys Out of all science labs constructed by the GEMA mission on Mars, the DSL - Dangerous Spec ...
- java反射和代理
这一篇我们说说反射和动态代理,为什么这两个要一起说呢?因为动态代理中会用到反射,而且java中反射的用处太多了,基本上无处不在,而且功能十分强大: 1.反射简介 反射是什么呢?一般都是很专业的说法:在 ...
- my-> git使用笔记
要在本地新建分支test0227并切换到该分支,运行git checkoutout 并加上-b参数,如: git checkout -b test0227 这相当于执行下面这两条命令: git bra ...
- 3)nginx的启动与停止、重启,linux配置对外端口
[启动] 启动代码格式:nginx安装目录地址 -c nginx配置文件地址例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /u ...