似懂非懂,一定要搞懂基础的,剩下的边做边学,从案例中入手。

有关cmake的介绍,请参考:

1、https://www.cnblogs.com/pam-sh/p/13885959.html

2、https://www.cnblogs.com/pam-sh/p/14800154.html

基础

A-hello-cmake(单文件)

1、文件结构

2、CMakeLists文件

#该项目所支持cmake的最低版本号
cmake_minimum_required(VERSION 3.5) #项目名称
project (hello_cmake) #指定从源文件生成可执行文件
add_executable(hello_cmake main.cpp)

注释:

(1)一般将项目名称作为可执行文件名

add_executable(${PROJECT_NAME} main.cpp)

B-hello-headers(多文件)

1、文件结构



2、CMakeLists文件

cmake_minimum_required(VERSION 3.5)
project (hello_headers) # 创建一个源文件变量,表示多个源文件(cpp)
set(SOURCES
src/Hello.cpp
src/main.cpp
) add_executable(hello_headers ${SOURCES}) # 存在不同文件夹(头文件)时,使用该命令让编译器知道,其中PRIVATE表示include文件的使用范围target_include_directories(hello_headers
PRIVATE
${PROJECT_SOURCE_DIR}/include
)

注释:

1、变量说明

CMake语法指定了许多变量,可用于帮助在项目或源代码树中查找有用的目录。其中包括:

(1)CMAKE_SOURCE_DIR:项目根目录

(2)CMAKE_CURRENT_SOURCE_DIR:当前项目原目录(若存在子项目)

(3)PROJECT_SOURCE_DIR:当前cmake项目的源目录。

(4)CMAKE_BINARY_DIR:binary / build的目录,即运行cmake的目录

(5)CMAKE_CURRENT_BINARY_DIR:当前所在的build目录

(6)PROJECT_BINARY_DIR:当前项目的build目录

2、在创建源文件变量时可以使用通配符

#利用GLOB命令,识别通配符,
file(GLOB SOURCES "src/*.cpp")

3、target_include_directories() 中的权限

(1)PRIVATE:被添加到目标include目录

(2)INTERFACE:被添加到任何链接此库的目录中

(3)PUBLIC:此库和其他目标都有链接

这里include中的头文件,正好对应着文件中过的引用。

C-static-library(静态库)

1、文件结构



2、CMakeLists文件

cmake_minimum_required(VERSION 3.5)
project(hello_library) ############################################################
# Create a library
############################################################ #从源文件中生成一个静态库(libhello_library.a)
add_library(hello_library STATIC
src/Hello.cpp
) target_include_directories(hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
) ############################################################
# Create an executable
############################################################ # Add an executable with the above sources
add_executable(hello_binary
src/main.cpp
) # 链接静态库,即将该静态库告知编译器
target_link_libraries( hello_binary
PRIVATE
hello_library
)

注释:

1、使用add_library()将源文件转换为静态库

2、使用target_link_libraries()函数导入静态库

D-shared-library(动态库)

1、文件结构

2、CMakeLists文件

cmake_minimum_required(VERSION 3.5)
project(hello_library) ############################################################
# Create a library
############################################################ #从源文件中生成一个分析库/动态库(libhello_library.so/libhello_library.dylib)
add_library(hello_library SHARED
src/Hello.cpp
)
# 给动态库取一个别名,可以代替该库使用
add_library(hello::library ALIAS hello_library) target_include_directories(hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
) ############################################################
# Create an executable
############################################################ # Add an executable with the above sources
add_executable(hello_binary
src/main.cpp
) # 链接此动态库
target_link_libraries( hello_binary
PRIVATE
hello::library
)

E-installing(make install)

1、文件结构

2、CMakeLists文件

cmake_minimum_required(VERSION 3.5)
project(cmake_examples_install) ############################################################
# Create a library
############################################################ #创建一个动态库
add_library(cmake_examples_inst SHARED
src/Hello.cpp
) # 引入头文件
target_include_directories(cmake_examples_inst
PUBLIC
${PROJECT_SOURCE_DIR}/include
) ############################################################
# Create an executable
############################################################ # Add an executable with the above sources
add_executable(cmake_examples_inst_bin
src/main.cpp
) #链接动态库
# link the new hello_library target with the hello_binary target
target_link_libraries( cmake_examples_inst_bin
PRIVATE
cmake_examples_inst
) ############################################################
# Install
#${CMAKE_INSTALL_PREFIX}默认是/usr/local
############################################################ # 将生成的可执行文件(cmake_examples_inst_bin)下载到${CMAKE_INSTALL_PREFIX}/bin文件夹下,
install (TARGETS cmake_examples_inst_bin
DESTINATION bin) # 将生成的动态库(libcmake_examples_inst.dylib)下载到${CMAKE_INSTALL_PREFIX}/lib文件夹下
# Note: may not work on windows
install (TARGETS cmake_examples_inst
LIBRARY DESTINATION lib) # 将该库的头文件下载到${CMAKE_INSTALL_PREFIX}/include文件夹下
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
DESTINATION include) # 将该库的设置文件下载到${CMAKE_INSTALL_PREFIX}/etc文件夹下
install (FILES cmake-examples.conf
DESTINATION etc)

注释:

1、在make install时,若在Windows平台中:

install (TARGETS cmake_examples_inst
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)

2、在make install 后,会生成install_manifest.txt文件,记录下载的信息

3、下载位置默认为:/usr/local,可以通过该方式指定下载位置:

(1)在cmake时每次手动指定

cmake .. -DCMAKE_INSTALL_PREFIX=/install/location

(2)在CMakeLists文件中指定

if( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT )
message(STATUS "Setting default CMAKE_INSTALL_PREFIX path to ${CMAKE_BINARY_DIR}/install")
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE STRING "The path to use for make install" FORCE)
endif()

(3)在make时手动指定

make install DESTDIR=指定安装位置

F-build-type(调试类型)

1、文件结构

2、CMakeLists文件

# Set the minimum version of CMake that can be used
# To find the cmake version run
# $ cmake --version
cmake_minimum_required(VERSION 3.5) # 设置默认调试类型(RelWithDebInfo)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message("Setting build type to 'RelWithDebInfo' as none was specified.")
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif() # Set the project name
project (build_type) # Add an executable
add_executable(cmake_examples_build_type main.cpp)

注释:

1、在调试build时,可以指定调试类型:

(1)Release:命令参数 -O3 -DNDEBUG

(2)Debug:命令参数 -g

(3)MinSizeRel:命令参数 -Os -DNDEBUG

(4)RelWithDebInfo:命令参数 -O2 -g -DNDEBUG

可以手动设置:

cmake .. -DCMAKE_BUILD_TYPE=Release/Debug/MinSizeRel/RelWithDebInfo

也可以设置为默认:

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message("Setting build type to 'RelWithDebInfo' as none was specified.")
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif()

也可以在cmake中设置:

G-compile-flags(不太懂)

1、文件结构



2、CMakeLists文件


注释:

1、使用target_compile_definitions()函数

2、使用CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS变量

H-third-party-library(第三方库)

在cmake中,使用find_package()函数引入第三方库,它能找到CMAKE_MODULE_PATH(默认为/usr/share/cmake/Modules)目录下的FindXXX.cmake文件。

这里以Boost库为例,boost更多可参考:https://www.cnblogs.com/pam-sh/p/16107753.html

1、文件结构

2、CMakeLists文件

cmake_minimum_required(VERSION 3.5)
# Set the project name
project (third_party_include) # 使用库文件系统和系统查找boost库的.cmake文件
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system) # 检查是否找到boost
if(Boost_FOUND)
message ("boost found")
else()
message (FATAL_ERROR "Cannot find Boost")
endif() # Add an executable
add_executable(third_party_include main.cpp) # 链接boost库
target_link_libraries( third_party_include
PRIVATE
Boost::filesystem
)

注释:

1、find_package()

可以在CMAKE_MODULE_PATH目录下查找类似FindXXX.cmake的文件。

解释一下:find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)

  • Boost:表示引入的第三方库的名字,找的就是FindBoost.cmake
  • 1.46.1:表示支持的boost最低版本
  • REQUIRED:表示这库是必要要有的,不然会出错
  • COMPONENTS:表示会在哪找这个库,filesystem和system表示。。

2、Checking if the package is found

很多库中都会设置一个变量“XXX_FOUND”,能够检查系统中是否存在对应的库,以boost为例:

if(Boost_FOUND)
message ("boost found")
include_directories(${Boost_INCLUDE_DIRS})
else()
message (FATAL_ERROR "Cannot find Boost")
endif()

在找到包后,通常会导出一些变量,告知库的头文件、静态文件、可执行文件在哪个位置,这些信息通畅里记录在FindXXX.cmake文件中。

上面例子中的:Boost_INCLUDE_DIRS就表示boost库的头文件。

可以使用ccmakecmake-gui在缓存中检查这些变量。

3、别名

当前很多库会使用别名,更加方便的表示,比如boost库,会使用Boost::导出别名:

  • Boost::boost:仅表示库的头文件
  • Boost::system:表示boost系统库
  • Boost::filesystem :表示文件系统

并且会有依赖关系,当使用Boost::filesystem时,会依赖于Boost::boost 和 Boost::system

如果要有针对的导入,可以使用:

target_link_libraries( third_party_include
PRIVATE
Boost::filesystem
)

而不使用别名时,则会单独指出:

# Include the boost headers
target_include_directories( third_party_include
PRIVATE ${Boost_INCLUDE_DIRS}
) # link against the boost libraries
target_link_libraries( third_party_include
PRIVATE
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY}
)

其中:

target_include_directories:指向库的include目录,即表示库的头文件

target_link_libraries:表示库的路径

参考

1、https://github.com/ttroy50/cmake-examples

这是一个学习cmake的地方,有很多案例可以学习,从浅入深

2、https://pan.baidu.com/s/1Bvzy0gK4O5vEYti3VV2A5g

提取码:0un9,别人总结的笔记

3、CmakeList入门

cmake-2的更多相关文章

  1. 使用cmake自动构建工程

    公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...

  2. CMake

    使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...

  3. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

  4. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  5. cmake cannot find package

    cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...

  6. Cmake的交叉编译

    http://www.cmake.org/Wiki/CMake_Cross_Compiling

  7. CMake命令/函数汇总(翻译自官方手册)

    查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...

  8. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  10. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

随机推荐

  1. Redis学习笔记整理

    一.Redis概述 1.redis简介 Redis(REmote DIctionary Server 远程字典服务器)是一款开源的,用ANSI C编写.支持网络.基于内存.亦可持久化的日志型.Key- ...

  2. 定位模组LuatOS快速入门:源UART串口通信

    合宙Air201资产定位模组--是一个集成超低功耗4G通信.语音通话.超低功耗定位.计步.震动.Type-C.充电.放音.录音等功能的超小PCBA. 内部集成高效.简单.可靠的LuatOS语言,旨在帮 ...

  3. 学校官网应该使用哪种SSL证书?

    学校官网在选择SSL证书时,应考虑多个因素,包括网站的性质.安全要求.预算以及证书的管理便捷性等.以下是关于学校官网应使用哪种SSL证书的详细分析: 多域名和子域名需求: 如果学校官网有多个子域名或者 ...

  4. 微信小程序原生AI运动(动作)检测识别解决方案

    前几年受疫情影响,人员流动受限,反而让"AI运动"概念风靡一时.空前火爆.目前已经在AI运动锻炼.体育教学.线上运动主题活动等场景中,成功得到了应用,并获得了广大互联网用户的认可. ...

  5. php 读取 csv 转数组列表

    我们有个文档需要修改,但是文档列太多,以及数量太大,以至于眼睛看起来很吃力,于是我决定做个简单的转化用脚本读取我想要验证的列的内容是否正确. 于是就产生了一个这样将csv快速的转为数组列表的功能函数 ...

  6. 基于nginx的tomcat负载均衡和集群(超简单)

    今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点. 略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群t ...

  7. Docker之修改默认存储路径

    背景:Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录,用以存放拉取的镜像和创建的容器等.不过由于此目录一般都位于系统盘,遇到系统盘比较小,而镜像和容器多了后 ...

  8. 【架构】整理了一份通用的MVP框架示例代码

    最近回顾了一下MVP框架,结合阅读到的几篇不错的博客,自己整理了一份可用于实际工作的MVP框架示例代码,这里做个记录,也顺便和网友们分享一下. 代码示例演示的是一个输入员工号查询员工信息并显示的场景, ...

  9. GZY.EFCore.BulkExtensions 支持达梦数据库的EF Core批量操作库详解

    前言 EFCore.BulkExtensions是一个常用的EF core 批量处理数据的库. 但是支持的数据库相对较少.特别是.NET5.0版本 连MySQL都无法支持 这个库就是改造的最新EFCo ...

  10. 远程连接利器:玩转MobaXterm

    今天这篇文章轻松不烧脑,主要是想和大家分享一下我在工作中常用的远程管理工具--MobaXterm.这款工具不仅功能强大,而且在日常的远程操作中极为高效,特别适合用来管理远程服务器.MobaXterm结 ...