IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> CMake学习笔记(待补充) -> 正文阅读

[开发工具]CMake学习笔记(待补充)

CMake概述

不同平台编译的问题

GNU Make,MS nmake,这些Make工具遵循着不同的规范和标准,所执行的Makefile格式千差万别。为了跨平台生成Makefile,CMake应时而生。

Cmake组成

CMake是一个构建系统,始于1999年,其开发公司Kitware设计其的目的是提供一组工具,实现在不同平台上配置、构建、测试和部署项目。
CMake软件工具集,主要包括:

  • CMake:对可执行文件和库的构建
  • CTest:测试相关
  • CPack:打包
  • CDash:测试结果面板展示

这些软件工具集构成的项目时序图如下所示:
在这里插入图片描述

CMake的使用分为两部分:

  • 程序管理:书写CMakeList.txt这个文件
  • 程序构建:通过CMake生成makefile等平台支持的构建文件
    在linux平台下使用CMake生成Makefile并编译的流程如下:
    在这里插入图片描述

CMakeLists.txt

基本概念

  • 命令:即CMake中的函数,大部分情况下是设置“变量”
  • 变量:内部变量or自定义变量
  • 包or库

简单实例

  1. 最基本的CMakeLists.txt应该包含的东西
# 设置最低CMake版本
cmake_minimum_required(VERSION 3.5)
#      工程名称 版本号      使用的语言(c++project(test VERSION 0.1 LANGUAGES CXX)
# 非必须,设置工程包含当前目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# 设置c++标准为c++11,且强制c++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找qt5中的库文件,REQUIRED表示为必须的
find_package(QT5 COMPONENTS Widgets REQUIRED)

# 设置自定义变量,将四个文件设置为PROJECT_SOURCES变量
set(PROJECT_SOURCES
		main.cpp
		widget.cpp
		widget.h
		widget.ui
)

#添加一个可执行文件,名字是test
add_executable(test
	${PROJECT_SOURCES}
)

# test这个可执行文件需要一个第三方库,即Qt5中的Widgets
target_link_libraries(test 	Qt5::Widgets)
  1. 库文件怎么搞?

# 这是一个名为add的库文件
cmake_minimum_required(VERSION 3.14)

project(add LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#写两个是因为要兼容QT5和QT6
find_package(QT NAMES QT6 QT5 COMPONETNTS Core REQUIRED)
find_package(QT${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)

#与add_executable不同,此处library明显告诉是在生成一个库文件
add_library(add SHARED
	add_global.h
	add.cpp
	add.h
)

target_link_libraries(add PRIVATE Qt${QT_VERSION_MAJOR}::core)

#额外的宏定义   在库add中增加ADD_LIBRARY
target_compile_definitions(add PRIVATE ADD_LIBRARY)

在库中增加宏定义的原因是因为一些头文件有一些条件宏定义,如下

#add_globar.h

#ifndef ADD_GLOBAL_H
#define ADD_GLOBAL_H

#include<QtCore/qglobar.h>
#if defined(ADD_LIBRARY)
#	define ADD_EXPORT Q_DECL_EXPORT
#else
# define ADD_EXPORT Q_DECL_IMPORT
#endif

#endif 

如上有一个自定义的库,但由于不是包,不能使用find_package命令,不必须通过如下方式引用

cmake_minimum_required(VERSION 3.5)
project(test VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_compile_options(-finput-charset=GBK)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

set(PROJECT_SOURCES
		main.cpp
		widget.cpp
		widget.h
		widget.ui
)
# 告诉编译器头文件要去哪里找
#${CMAKE_CURRENT_SOURCE_DIR}就是指当前CMakeLists.txt所在目录
include_directories(
	${CMAKE_CURRENT_SOURCE_DIR}/../
)
# 告诉编译器库文件本身要去哪里找
link_directories(
	${CMKAE_CURRENT_SOURCE_DIR}/../build-add-unknown-Debug/
)

add_executable(test
	${PROJECT_SOURCES}
)

target_link_libraries(test Qt5::Widgets)
# 指定要加载的libadd.so库即可
target_link_libraries(test libadd.so)
  1. 多库之间存在依赖问题
    如上有两个程序,一个可执行文件test和一个库add,且test依赖于add
    在这里插入图片描述
    如何考虑这种情况的编译
cmake_minimum_required(VERSION 3.14)

project(ProgramOne Languages CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#通过add_subdirectory实现多程序管理
add_subdirectory(add)
add_subdirectory(test)

可以看到不管是根目录还是子目录,都重复出现了变量的设置。但父目录设置的一些变量会被应用于子目录,对于target_开头的命令其不会被子目录共享(因此其只适用于子对象)。

  1. make install
    为了使所需文件不分散放置在各个源代码目录中,通常希望自动将编译好的文件放置在一个统一的目录中,可以
#通过FILES指定要安装哪些头文件,通过DESTINATION指定文件要放置的目录,如果不使用DESTINATION,则默认安装到默认目录相对于(CMAKE_INSTALL_PREFIX的lib目录)
install(FILES add_global.h add.h
		DESTINATION include/add
		)
#通过TARGEST指定要安装生成的库文件
install(TARGETS add
		)
#不使用DESTINATION则表示安装到默认目录(相对于CMAKE_INSTALL_PREFIX的bin目录)
install(TARGETS test
)
#根据文件的类型指定放置的位置
install(TARGET add
	RUNTIME DESTINATION bin
	LIBRARY DESTINATION lib
	ARCHIVE DESTINATION lib
)
  1. target_开头命令
    target_开头命令不是一个全局命令,是一个只针对当前当前特定编译目标的设置
target_include_directories(test PUBLIC
	${CMAKE_CURRENT_SOURCE_DIR}/../
)
target_compile_options(test PRIVATE -finput-charset=GBK)

补充的一些函数

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

   |
    +--- main.cc
    |
    +--- MathFunctions.cc
    |
    +--- MathFunctions.h

#法一
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2)

# 指定生成目标
add_executable(Demo main.cc MathFunctions.cc)

#法二
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:02:43  更:2021-11-16 19:04:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/23 22:56:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计