前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMake编写总结

CMake编写总结

作者头像
impressionyang
发布2020-08-27 11:15:22
1K0
发布2020-08-27 11:15:22
举报

CMake编写总结

  • 不定期更新

CMake介绍

  • 以下来自百度百科

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。CMake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

CMake和make

  • 以下来自百度百科

“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

makeCMake之间的关系是CMake 通过命令可以生成make执行的Makefile文件,所以说CMakemake 的升级版的生成工具

CMake文档

点击此处到达CMake的在线文档页面。

各种CMake编写

  • 以下收录的是本人自己的各种项目的CMakeLists.txt文件,以做参考

CMakeLists.txt一般使用格式

代码语言:javascript
复制
#set minimum compile version
CMake_minimum_required(VERSION 3.14)

#set project name
project(CMaketest)

#set target app name
set(TARGET_NAME test)


...


#genarate a app
add_executable(${TARGET_NAME} 源文件 头文件)

简单C++项目编写CMakeLists.txt

  • 简单项目是指只有一个文件夹,并且所有项目文件都放在其中的项目,由于文件结构简单,直接使用一下内容即可将项目进行编译。
代码语言:javascript
复制
ProjectName                     #项目目录
├── CMakeLists.txt              #项目根目录CMakeLists.txt配置文件
├── main.cpp                #程序入口
├── ...                     #其他项目文件
└── test.cpp                #其他项目文件
  • 在当前项目文件夹新建CMakeLists.txt文件,并输入以下内容
代码语言:javascript
复制
#set minimum compile version
CMake_minimum_required(VERSION 3.14)

#set project name
project(CMaketest)

#set target app name
set(TARGET_NAME test)

#use c++ 17 stander
set(CMake_CXX_STANDERD 17)


#set all resources files
file(GLOB SOURCES "*.cpp")
file(GLOB HEADERS "*.h")


#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS})
  • **注意:**简单项目不推荐使用GLOB_RECURSE,因为他会遍历所有找到的文件夹以及他的子文件夹,容易造成把build目录扫描导致main函数重复定义的情况

完成后用CMake编译生成makefile,即可使用make命令进行项目的编译了

复杂(多文件夹)C++项目写CMakeLists.txt

复杂项目示例
  • 一般有较多文件的项目都是使用多文件夹进行管理项目源文件的,使用多个不同级目录下保存源文件的管理方式使用CMake生成makefile可以使用以下管理方式
代码语言:javascript
复制
ProjectName                     #项目目录
├── CMakeLists.txt              #项目根目录CMakeLists.txt配置文件
└── src                         #源码目录
    ├──utilities                #次级原码目录
    |   ├── CMakeLists.txt      #次级源码目录CMakeLists.txt配置文件
    |   ├── util.h              #其他次级源码
    |   ├── util.cpp            #其他次级源码
    |   ├── ...                 #其他次级源码
    |   └── log.cpp             #其他次级源码
    |   ...                     #其他次级原码目录
    ├── CMakeLists.txt          #源码目录CMakeLists.txt配置文件
    ├── main.cpp                #程序入口
    ├── ...                     #其他项目文件
    └── test.cpp                #其他项目文件
复杂项目的CMakeLists.txt
  1. CMakeLists.txt #项目根目录CMakeLists.txt配置文件
代码语言:javascript
复制
#set minimum compile version
CMake_minimum_required(VERSION 3.14)

#set project name
project(CMaketest)

#add the src subdirectory
add_subdirectory(src)
  1. CMakeLists.txt #源码目录CMakeLists.txt配置文件
代码语言:javascript
复制
#set minimum CMake compile version
CMake_minimum_required(VERSION 3.14)

#set target app name
set(TARGET_NAME testCMake)

#use c++ 17 stander
set(CMake_CXX_STANDERD 17)

# add a source file subdirectory
add_subdirectory(utilities)

#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")


#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS})
  1. CMakeLists.txt #次级源码目录CMakeLists.txt配置文件
  • 其他次级原码目录CMakeLists.txt配置文件一样
  • 可以不配置,因为使用了源码目录的CMakeLists.txt使用了GLOB_RECURSE,正常情况会自动遍历到此文件夹下
代码语言:javascript
复制
#set minimum compile version
CMake_minimum_required(VERSION 3.14)

#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
  • 这样就可以对多个文件夹管理的项目使用CMake生成makefile了

qt项目编写CMake

  • qt项目需要添加相应的库,只需要将一些配置项添加在源码目录CMakeLists.txt配置文件即可
代码语言:javascript
复制
#set minimum CMake compile version
CMake_minimum_required(VERSION 3.14)

#set target app name
set(TARGET_NAME testCMake)

#use c++ 17 stander
set(CMake_CXX_STANDERD 17)
set(CMake_CXX_STANDARD_REQUIRED ON)

#include this priject on
set(CMake_INCLUDE_CURRENT_DIR ON)

#auto genarate ui.h file
set(CMake_AUTOUIC ON)

#auto genarete moc file
set(CMake_AUTOMOC ON)

#auto genarate .qrc file on
set(CMake_AUTORCC ON)

# set QT type
set(QT Core Gui Widgets Network DBus Sql)

#add package lib
find_package(Qt5 REQUIRED ${QT})

# add a source file subdirectory
#add_subdirectory(utilities)

#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")


#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})

#add QT5 dependes
target_link_libraries(${TARGET_NAME} PRIVATE Qt5::Widgets)

使用

在当前文件夹下使用一下命令可以生成Makefile

代码语言:javascript
复制
cmake
  • 但是,如此生成的话会产生很多中间文件,从而导致了当前文件夹的文件过多,再次编辑文件的时候会很难找到确切的文件的状况,这就是污染项目结构
  • 所以,为了不污染项目环境,推荐使用以下命令来生成Makefile
代码语言:javascript
复制
mkdir build
cd build
cmake ..
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CMake编写总结
  • CMake介绍
    • CMake和make
    • CMake文档
    • 各种CMake编写
      • CMakeLists.txt一般使用格式
        • 简单C++项目编写CMakeLists.txt
          • 复杂(多文件夹)C++项目写CMakeLists.txt
            • 复杂项目示例
            • 复杂项目的CMakeLists.txt
          • qt项目编写CMake
          • 使用
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档