根据网上的资料,我总结了一下,一个工程应该有根目录(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

分享推送

ubuntu16.04下Cmake学习一的更多相关文章

  1. docker学习笔记(一)—— ubuntu16.04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

  2. 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案

    本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进 ...

  3. Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)

    Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...

  4. ubuntu16.04系统深度学习开发环境、常用软件环境(如vscode、wine QQ、 360wifi驱动(第三代暂无))搭建相关资料

    事后补充比较全面的(找对资料真的省一半功夫):https://www.jianshu.com/p/5b708817f5d8?from=groupmessage Ubuntu16.04 + 1080Ti ...

  5. ubuntu16.04下安装artoolkit5

    目前对AR技术的常见理解就是CV(Computer Vision)+CG(Computer Graphic).CV的方法很多,简单些比如FREAK+ICP(ARToolKit中的NFT),复杂些就是S ...

  6. Ubuntu16.04下编译安装及运行单目ORBSLAM2

    官网有源代码和配置教程,地址是 https://github.com/raulmur/ORB_SLAM2 1 安装必要工具 首先,有两个工具是需要提前安装的.即cmake和Git. sudo apt- ...

  7. Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法

    目录 Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法 安装过程 1. 深度学习环境Tensorflow的安装 2. 安装python包 3.   ...

  8. Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...

  9. ubuntu16.04下笔记本自带摄像头编译运行PTAM

    ubuntu16.04下笔记本自带摄像头编译运行PTAM 转载请注明链接:https://i.cnblogs.com/EditPosts.aspx?postid=9014147 个人邮箱:feifan ...

随机推荐

  1. Scrapy安装报错 Microsoft Visual C++ 14.0 is required 解决办法

    Scrapy安装报错 Microsoft Visual C++ 14.0 is required 解决办法原因:Scrapy需要的组 twisted 需要 C++环境编译. 方法一:根据错误提示去对应 ...

  2. Union和Concat的区别,以及它们的速度 (C# Linq)

    原文发布时间为:2011-06-29 -- 来源于本人的百度文章 [由搬家工具导入] Union 会去重复后合并。而Contact不去重直接合并。 所以Contact当然比较快了。所以如果你不用去重的 ...

  3. Docker(五):镜像

    一,什么是镜像? Docker的镜像文件是由文件系统叠加而成的.最底端是一个引导文件系统,即bootfs.Docker用户几乎永远没有机会和引导文件有什么交互,实际上,当一个容器启动之后,容器就会被移 ...

  4. vue 设置头文件

    vue的头文件是在index.html文件中设置的,毕竟vue的入口 先说一下标签页的名字: 就是这个名字的设置,要想每个标签页的名字都不一样,需要做以下这三步:1. 首先,在index.html文件 ...

  5. 启动tomcat服务器自动执行一个方法

    第一步:配置web.xml文件 添加如下代码 <servlet> <servlet-name>Timer</servlet-name> <servlet-cl ...

  6. LeetCode OJ--Same Tree

    https://oj.leetcode.com/problems/same-tree/ 判断两个二叉树,是否相等. 深搜 /** * Definition for binary tree * stru ...

  7. 使用Nginx+FFMPEG搭建HLS直播转码服务器

    目的:使Nginx支持Rtmp协议推流,并支持hls分发功能及FFMPEG转码多码率功能. 一.准备工作 模块:nginx-rtmp-module-master(支持rtmp协议) 下载地址: htt ...

  8. 四、Ubuntu 一些常用命令

    1.锁定root用户 :sudo passwd -l root 2.解锁root用户 :sudo passwd -u root 3.切换身份:su root  或者  su 其他用户名,然后输入密码, ...

  9. iOS数组去重的方法,超级简单

    //最近新发现的一个数组去重,用不着循环,一句代码搞定 //去除数组中重复的 NSArray *oldArr = @[@"1",@"2",@"3&qu ...

  10. Cryptography I 学习笔记 --- 总结

    在b站上大概的看完了Dan Boneh的密码学,对现代密码学总算有了一个粗浅的认识. 总算能在纸上手写RSA公式并且证明之了,蛤蛤. 总体的感触就是,现代密码学是一个非常博大精深的体系,我等程序员最重 ...