利用CMake搭建软件编译架构

0 写在前面的话

本博文主要介绍如何利用cmake组织软件编译,并且提供一个简单的软件编译架构的模板。大家可以根据自己实际情况进行改动,本文主要的内容:

  • cmake 命令简介
  • cmake 常用API详解
  • 利用cmake搭建软件编译框架

主要的软件环境如下:

  • cmake版本:3.15
  • os:Ubuntu 18.04 64bit
  • Language:c/c++
  • cmake 命令行模式
    大家可以从cmake官网下载cmake工具、查看相关的文档
    Cmake官网

1 CMake 能做什么

CMake是一种管理源代码编译的工具,最初被设计成Makefile的生成器,随着应用越来越广泛,利用CMake可以生成Visual Studio 等IDE的工程文件以便于其进行编译。CMake主要在c/c++中使用,当然也可以利用它进行编译其他语言。

2 CMake编译模板 整体框架

目录结构如下:

.
├── app  // 生成各种可执行文件
│   ├── CMakeLists.txt  // 添加各种子目录
│   └── cmake_test
│       ├── CMakeLists.txt  // 生成可执行文件 cmake_test
│       └── cmake_test.cpp
├── cmake_config  // cmake相关配置文件
│   ├── cm_commom.cmake  // 添加cmake一些公共的配置信息:比如说编译选项等
│   ├── cm_device_type.cmake // 设备型号配置文件
│   ├── cm_platform.cmake  // 平台相关的配置文件 比如说:硬件平台 软件平台等
│   └── cm_X86_64.cmake  // X86_64对应的配置文件
├── CMakeLists.txt  // 总体的cmake文件
├── components  // 组件类的配置文件 软件系统的各个组件
│   ├── CMakeLists.txt  // 本级目录的cmake文件
│   └── dpdk_fifo  // 无锁队列目录
│       ├── CMakeLists.txt // 生成 静态库或者动态库
│       ├── rte_atomic.h
│       ├── rte_ring.cpp
│       └── rte_ring.h
├── include  // 公共的头文件
├── lib  // Generate Dynamic Library or Static Library  in this directory ,all kinds of platform
│   └── X86_64  // X86_64 platform
│       ├── libdpdk_fifo.a
│       └── libdpdk_fifo.so
├── main_frame   // the main frame directory:include the main frame of the software system
│   ├── CMakeLists.txt
│   └── Event  // the event modle  handles all kinds of event,such as: read write timer signal etc..
│       └── CMakeLists.txt
├── out  // the out directory : the exe file and the dynamic library
│   └── cmake_test
│       ├── cmake_test
│       └── libdpdk_fifo.so
└── third_party  // the third party header file in this directory

3 项目使用

建立一个临时的编译目录 在该目录中生成大量的中间文件

root@wan:/wan/fly_in_coding# mkdir build
root@wan:/wan/fly_in_coding# cd build/
root@wan:/wan/fly_in_coding/build# pwd
/wan/fly_in_coding/build
root@wan:/wan/fly_in_coding/build# pwd
/wan/fly_in_coding/build

生成Makefile

root@wan:/wan/fly_in_coding/build# cmake ../ -Dplatform=X86_64
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /wan/fly_in_coding/build

执行编译

root@wan:/wan/fly_in_coding/build# make
Scanning dependencies of target dpdk_fifo
[ 25%] Building CXX object components/dpdk_fifo/CMakeFiles/dpdk_fifo.dir/rte_ring.cpp.o
[ 50%] Linking CXX shared library ../../../lib/X86_64/libdpdk_fifo.so
[ 50%] Built target dpdk_fifo
Scanning dependencies of target cmake_test
[ 75%] Building CXX object app/cmake_test/CMakeFiles/cmake_test.dir/cmake_test.cpp.o
[100%] Linking CXX executable cmake_test
[100%] Built target cmake_test
root@wan:/wan/fly_in_coding/build# ls
app  CMakeCache.txt  CMakeFiles  cmake_install.cmake  components  Makefile

进行安装 将动态库和可执行 文件复制到一个单独的目录下

root@wan:/wan/fly_in_coding/build# make install
[ 50%] Built target dpdk_fifo
[100%] Built target cmake_test
Install the project...
-- Install configuration: ""
-- Installing: /wan/fly_in_coding/out/cmake_test/cmake_test
-- Set runtime path of "/wan/fly_in_coding/out/cmake_test/cmake_test" to ""
-- Up-to-date: /wan/fly_in_coding/out/cmake_test
-- Installing: /wan/fly_in_coding/out/cmake_test/libdpdk_fifo.so

4 cmake文件清单及详解

4.1 顶级CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
add_subdirectory(components)
add_subdirectory(app)

4.2 app CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
add_subdirectory(cmake_test)

4.2.1 cmake_test中文件清单

CMakeLists.txt

#要求cmake版本最低3.5
cmake_minimum_required(VERSION 3.5)
include (../../cmake_config/cm_commom.cmake)
#根据设备类型选择不同的cmake配置文件
include (${PROJECT_ROOT_PATH}/cmake_config/cm_X86_64.cmake)
#设置当前工程名字
set(project_name cmake_test)
set (CMAKE_INSTALL_PREFIX ${PROJECT_ROOT_PATH}/out/${project_name})
#添加源文件目录
aux_source_directory(. DIR_SRCS)#当前模块生成可以行文件
add_executable(${project_name} ${DIR_SRCS})#添加当前模块需要的库
target_link_libraries(${project_name}  libdpdk_fifo.so )
install(TARGETS ${project_name} DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY ${LIBRARY_OUTPUT_PATH}/ DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.so")

cmake_test.cpp

#include <stdio.h>
#include "rte_ring.h"
int main(void)
{struct rte_ring * r = NULL;r = rte_ring_create("test_ring",32,0);if(r != NULL){rte_ring_destory(r);}else{}printf("cmake_test \n");return 0;
}

4.3 cmake_config 文件详解

├── cmake_config // cmake相关配置文件
│ ├── cm_commom.cmake // 添加cmake一些公共的配置信息:比如说编译选项等
│ ├── cm_device_type.cmake // 设备型号配置文件
│ ├── cm_platform.cmake // 平台相关的配置文件 比如说:硬件平台 软件平台等
│ └── cm_X86_64.cmake // X86_64对应的配置文件

cm_commom.cmake

#添加 c++11 编译选项
add_compile_options(-std=c++11)#添加 debug -g 编译选项
add_compile_options(-g)add_compile_options(-fPIC)#把编译警告当做错误处理
#add_compile_options(-Werror) SET(PROJECT_ROOT_PATH "/wan/fly_in_coding")#添加公共的头文件
include_directories(#当前./ # 第三库文件   ${PROJECT_ROOT_PATH}/third_party/${PROJECT_ROOT_PATH}/app/cmake_test# 主框架头文件${PROJECT_ROOT_PATH}/main_frame/# 组件头文件${PROJECT_ROOT_PATH}/components/${PROJECT_ROOT_PATH}/components/dpdk_fifo/)
#SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_ROOT_PATH}/out)

cm_device_type.cmake

#根据设备类型选择不同的cmake配置文件
if(${DEVICE} STREQUAL "MODLE1")add_definitions(-DMODLE1)
elseif(${DEVICE} STREQUAL "MODLE2")add_definitions(-DMODLE2)
elseif(${DEVICE} STREQUAL "MODLE3")add_definitions(-DMODLE3)
elseif(${DEVICE} STREQUAL "MODLE4")add_definitions(-DMODLE4)
else()
endif()

cm_platform.cmake

#根据设备类型选择不同的cmake配置文件
if(${platform} STREQUAL "X86_64")include (${PROJECT_ROOT_PATH}/cmake_config/cm_X86_64.cmake)
elseif(${platform} STREQUAL "NPNC2")include (${PROJECT_ROOT_PATH}/cmake_config/cm_X86_64.cmake)
else()include (${PROJECT_ROOT_PATH}/cmake_config/cm_X86_64.cmake)
endif()

cm_X86_64.cmake

add_definitions(-DX86_64)
SET(LIBRARY_OUTPUT_PATH  ${PROJECT_ROOT_PATH}/lib/X86_64)
link_directories(${PROJECT_ROOT_PATH}/lib/X86_64)

4.4 components 文件详解

├── components // 组件类的配置文件 软件系统的各个组件
│ ├── CMakeLists.txt // 本级目录的cmake文件
CMakeLists.txt

#要求cmake版本最低3.5
cmake_minimum_required(VERSION 3.5)
# 添加子设备
add_subdirectory(dpdk_fifo)

│ └── dpdk_fifo // 无锁队列目录
│ ├── CMakeLists.txt // 生成 静态库或者动态库
│ ├── rte_atomic.h
│ ├── rte_ring.cpp
│ └── rte_ring.h

4.4.1 dpdk_fifo中文件清单

CMakeLists.txt

#要求cmake版本最低3.5
cmake_minimum_required(VERSION 3.5)include (../../cmake_config/cm_commom.cmake)
include (${PROJECT_ROOT_PATH}/cmake_config/cm_platform.cmake)#添加源文件目录
aux_source_directory(. DIR_SRCS)#当前模块生成静态库
#add_library(dpdk_fifo STATIC ${DIR_SRCS})
# 当前模块生成动态库
add_library(dpdk_fifo SHARED ${DIR_SRCS})

5 结束语

上述模板可以应用一般的项目,可以根据自己的实际情况进行改动,文件清单中对每个函数的使用也进行了比较详细地解释,如果对于文中API 还有不清楚的可以去cmake官网进行查看。

利用CMake搭建软件编译架构相关推荐

  1. 利用gulp搭建less编译环境

    什么是less? 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Fi ...

  2. cmake 安装_vscode不写一行配置,用cmake傻瓜式搭建C++编译调试环境

    网上看了一些用vscode+cmake搭建C++编译调试环境的帖子,基本差不多,都要写一个配置文件.其实根本不用这么麻烦.安装的工具是一样的,但是操作可以更加简单. VSCode + CMake超简单 ...

  3. 利用CMake编译OpenCV-4.1.2源码,使其可以在VS2012下进行图像处理开发的记录(因缺少OpenBLAS未成功)

    目前,OpenCV已经发展到OpenCV4.X了. OpenCV是以CMake 作为项目架构系统的开源项目. 在OpenCV4中,只为我们CMake编译好了64位的适用于vc14(Visual Stu ...

  4. 直播软件搭建直播服务架构

    直播软件搭建直播服务架构 前言 随着移动设备的普及和4G网络建设的全面铺开,短视频和直播行业日益火爆,其代表应用抖音.头条更是火遍大江南北,逐渐成为家喻户晓的国民APP.各大厂商也纷纷入局短视频赛道, ...

  5. 如何利用快解析软件搭建映射端口

    端口映射,就是将内网中主机的一个端口映射到外网主机的一个端口,提供相应的服务,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上.如何才能实现端口映射?今天小编给大家介绍两种 ...

  6. matlab搭建的应用层架构逻辑,软件设计的三层架构

    1:三层架构是什么? 三层架构是一个分层式的软件体系架构设计理念. 把软件架构分为三层: 1:UI层   (user interface layer)  界面层 2:BLL层 (business lo ...

  7. VS Code利用CMake工具编译Cpp文件报错

    VSCode 结合CMake个mingw编译Cpp项目 参考:1 配置C++和基础 报错时工具版本 Cmake工具版本为3.18.0免安装ZIP版本 mingw为8.1.0免安装ZIP版本 Path环 ...

  8. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  9. 从0开始利用VirtualBox搭建虚拟机靶场

    从0开始利用VirtualBox搭建虚拟机靶场 1. 前期准备配置 1.1 Gnome Desktop 安装 1.2 VNC配置 1.2.1 VNC Sever配置 1.2.2 VNC Client配 ...

最新文章

  1. 精心总结 Python『八宗罪』,邀你来吐槽
  2. 设置div中的div居中显示
  3. 2018python好找工作吗-2018年为什么要学习Python?Python还有前景吗?
  4. 深度学习数据集制作工作_创建我的第一个深度学习+数据科学工作站
  5. MySQL流浪记(六)—— CONCAT到GROUP_CONCAT的沿途风景(图文详解)
  6. 【学习笔记】数据链路层——信道划分访问控制(FDM、TDM、STDM、WDM、CDM CDMA)
  7. 监控利器--Cacti
  8. 【java】如何在IDEA 中查看 Class文件的汇编
  9. 20200819:力扣202周周赛题解记录
  10. 使用Socket类接收和发送数据
  11. 复旦大学邱锡鹏教授带你梳理深度学习知识脉络(直播彩蛋)
  12. 论文笔记:ARTNet、Non-local Neural Networks
  13. 机械制图标准化基础知识简介
  14. 【miscellaneous】如何利用硬盘号和CPU序列号为软件加密
  15. 非线性拟合matlab代码,Matlab非线性拟合
  16. 七种方式实现三栏布局
  17. MySQL数据库视图:视图定义、创建视图、修改视图
  18. html语言单词背不下来,英语单词怎么都背不下来怎么办
  19. WebRTC系列-Qos系列之接收NACK
  20. rdesktop安装教程

热门文章

  1. 苹果手机数据线充不了电_手机一天充几次电怎么办?手机的电被一些默认的设置耗掉了很多...
  2. Echarts中对地图的指定区域文字展示指定的颜色
  3. FreeRTOS堆栈溢出检查
  4. C++ OpenGL学习——入门篇
  5. 天籁obd接口针脚定义_OBD接口位置大全与obd接口针脚定义----太实用了!一定分享呀!...
  6. basler 相机取图超时_Opencv打开basler相机——实现显示视频、保存图片、记录视频(Windows下)...
  7. 橘子学设计模式之策略模式
  8. 35 个免费创新的响应式 HTML5 模板
  9. 伟大的太空星球移民计划
  10. DBUtils工具类实现增删改查