CMakeList.txt(3): 一个cmake实例
介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo。
先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:

1. 编写CMakeLists.txt
由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。
在工程项目中的父目录向有一个CMakeLists.txt是用以声明定义工程需要的Cmake设置还定义了子目录src,用以递归的调用src中的MakeLists.txt。
1) 工程目录的CMakeLists.txt内容定义如下:
PROJECT(HELLO) 定义工程的名称
ADD_SUBDIRECTORY(src) 用以递归的调用src中的MakeLists.txt
2)src里面的CMakeLists.txt内容定义如下:
ADD_SUBDIRECTORY(main) 用以递归的调用main中的MakeLists.txt
ADD_SUBDIRECTORY(util) 用以递归的调用util中的MakeLists.txt
3)util目录里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib) 定义了库生成的路径,LIBRARY_OUTPUT_PATH是一个内部变量,存放库生成路径
SET(CMAKE_C_COMPILER g++) 定义编译器
SET(SRC_LIST hello.c) 定义库文件需要的源文件
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) 定义非标准库头文件要搜索的路径
ADD_LIBRARY(util STATIC ${SRC_LIST})
4)在main目录中的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下:
SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin) 定义执行文件输出路径
SET(SRC_LIST main.cpp) 定义库文件需要的源文件
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) 定义非标准库头文件要搜索的路径
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) 定义依赖静态库要搜索的路径
ADD_EXECUTABLE(hello ${SRC_LIST}) 生成执行文件
TARGET_LINK_LIBRARIES(hello util) TARGET_LINK_LIBRARIES用以定义链接时需要的库文件。
2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令cmake ..,执行结果如下:

3)然后进行make

4)安装
重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)
这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中
cmake执行命令如下:cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..
这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:

CMakeList.txt(3): 一个cmake实例的更多相关文章
- ROS初级教程 cmake cmakelist.txt 的编写教程
有很多 的时候我们使用别人的程序包.然后添加东西的时候缺少什么东西,会使程序编译不过去,甚至无法运行,接下来介绍一下cmakelist.txt 的每一行的作用.为了以后添加和修改方便. 2.整体结构和 ...
- CMake 使用方法 & CMakeList.txt<转>
CMake 使用方法 & CMakeList.txt cmake 简介 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的make ...
- CMakeList.txt设置OpenCv路径
源文件imageBasics.cpp #include <iostream> #include <chrono> using namespace std; #include & ...
- 单个源文件下CmakeList.txt
单个源文件下CmakeList.txt 1. main.c代码 & CmakeLists.txt 文件内容 在任意自己选定的目录下(t1/)编写main.c 与 CmakeLists.txt ...
- C++ 容器的综合应用的一个简单实例——文本查询程序
C++ 容器的综合应用的一个简单实例——文本查询程序 [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例.通过实现一个简单的文本查 ...
- Asp.net读取和写入txt文件方法(实例)!
Asp.NET读取和写入txt文件方法(实例)! [程序第一行的引入命名空间文件 - 参考] System; using System.Collections; using System.Config ...
- 每天一个JavaScript实例-检測表单数据
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu......
报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu...... 原因: 1.第一次配置参数时,不完整,出现错误!,(报错也会产生CMak ...
- Android 只开启一个Activity实例
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...
随机推荐
- SuperMap 9D 实时数据服务学习笔记
SuperMap 在9月份发布了结合大数据技术的9D新产品,今天就和大家介绍下iServer9D中的实时数据服务. 1.技术框架 结合Spark的streaming流处理框架,将各种数据进行批量处理. ...
- Android Studio教程06-布局,监听器以及基本控件
目录 2. 监听器 3. 布局 3.1. 布局分类 (1). Linear Layout (2). Relative Layout (3). ListView (4). Grid View 4. 其他 ...
- 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署
通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...
- 安装CentOs 7.3
步 下载安装 CentOS 7.3 下载地址 1.官网:https://www.centos.org/download/ 2.centos阿里汇总:https://yq.aliyun.com/zt/ ...
- django logging
LOG_LEVEL = 'DEBUG' LOGGING = { 'version' : 1, 'disable_existing_loggers' : True, 'formatters' : { ' ...
- SpringBoot Mybatis 使用LocalDateTime
mybatis-spring-boot-starter 2.0.1 会报错,不知道如何解决(建议先不用) mybatis-spring-boot-starter 2.0.1 - 1.3.2 版本不会报 ...
- P3371 【模板】单源最短路径(弱化版)
// luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<algorithm> ...
- linux-高并发与负载均衡-lvs-DR模型试验
先配置3台虚拟机的网络 3台虚拟机克隆的方法:(....) etho,配置在同一个网段 DIP,RIP在一个网段 node01:作为lvs负载均衡服务器 node02:作为 Real Server n ...
- MySQL实现按天统计数据的方法
一.首先生成一个日期表,执行SQL如下: CREATE TABLE num (i int); ), (), (), (), (), (), (), (), (), (); CREATE TABLE i ...
- 使用python对py文件程序代码复用度检查
#!/user/bin/env python # @Time :2018/6/5 14:58 # @Author :PGIDYSQ #@File :PyCheck.py from os.path im ...