1、cmake简介
1.1 cmake是什么
CMake是一个开源、跨平台的编译(Build)工具,是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 CMake并不直接生成最终的软件,而是产生标准的建构文件(如Unix的Makefile或Windows Visual ,C++的projects/workspaces),这些文件可以被一般的编译工具所使用。
1.2 cmake能做什么
CMake是一个跨平台的构建自动化工具,可以自动生成跨平台的Makefile、Visual Studio等IDE项目、Xcode项目和Ninja build等常见项目文件。CMake的工作方式是通过读取CMakeLists.txt文件中的指令来生成相应的项目文件,从而支持多种编译器、操作系统、硬件架构等,为跨平台开发提供方便。CMake的具体功能包括但不限于:
- 编译源代码、制作程序库。CMake自己不编译程序,而是使用CMakeLists.txt构建脚本指挥各种编译工具生成可执行程序或链接库。
- 产生适配器(wrapper)。CMake还可以用任意的顺序建构执行档。
- 支持in-place建构(二进制文件和源代码在同一个目录树中)和out-of-place建构(二进制文件在别的目录里),因此可以很容易从同一个源代码目录树中构建出多个二进制文件。
- 测试编译器所支持的C++特性。
- 自定义编译选项和平台特定的配置,从而使软件可以在多个平台上正确地编译和运行。
- 自动检测在系统中已经安装的库和头文件,从而避免了手动配置环境变量和链接库的繁琐工作。
- 与其他构建工具(如make、Visual Studio等)无缝集成,这意味着开发者可以使用CMake来生成构建文件,然后将这些文件用作其他构建工具的输入,从而实现更高效的自动化构建过程。
总之,CMake是一个功能强大的跨平台自动化构建工具,能够大大提高软件编译和安装的效率和便利性。
1.3 cmake有什么优点
CMake是一个跨平台的构建系统,它有以下优点:
- 可移植性:CMake的目标是产生一种能与多种编译器以及在不同的操作系统上工作的构建系统。这使得CMake成为一个非常适合用于开源项目的构建系统,这些项目通常需要多种环境下的编译。
- 模块化:CMake的模块化设计使得它可以方便地添加或移除功能。例如,你可以轻松地为项目添加一个新的子目录,并为其添加一个新的CMakeLists.txt文件。
- 灵活性:CMake提供了一种名为"generator"的系统,允许你定制构建过程。例如,你可以为IDE生成项目文件,或者为持续集成系统生成构建任务。
- 可扩展性:CMake支持使用自定义的命令和函数来扩展其功能。这使得CMake非常适合用于大型的、复杂的项目,其中可能需要一些特殊的构建逻辑。
- 文档和社区支持:CMake有一个丰富的文档和活跃的社区,这意味着当你在使用CMake时遇到问题,你可以很容易地找到答案。
- 支持多种语言:CMake可以用于构建用多种语言编写的项目,包括C、C++、Fortran等。
*跨平台:它可以在三大主流平台上(Windows、Unix/Linux、MacOS)生成各自平台上的建构文件,从而编译出最终的可执行文件。 - 集成测试:CMake提供了方便的机制来编写测试用例,并可以将其集成到持续集成系统中。
- 灵活的缓存系统:CMake有一个灵活的缓存系统,可以让你存储和共享变量的值,这在大型项目中尤其有用。
- 持续集成友好:CMake可以很容易地与持续集成系统集成,例如Jenkins或CircleCI。这意味着你可以轻松地在这些系统中设置自动构建和测试任务。
以上就是CMake的一些优点,这使得它成为了一个强大且灵活的构建系统,无论是对于小型项目还是大型项目都非常适用
1.4 cmake下载安装
cmake 可直接在官网上下载,官网地址:https://cmake.org/
cmake Windows版本的安装配置详情可参考:https://blog.csdn.net/weixin_52677672/article/details/135815928
2、使用cmake生成c++项目
2.1 CMakeLists.txt文件配置使用
CMakeLists.txt 文件是用于描述 CMake 构建过程和项目配置的文件。它包含了一系列 CMake 命令、变量设置和流程控制结构,用于告诉 CMake 如何生成适合你的平台和编译器的构建系统文件。
常见内容和结构:
bash
project():设置项目名称和版本号。
cmake_minimum_required():设置 CMake 的最低版本要求。
set():设置变量的值。
add_executable():添加可执行文件。
add_library():添加库文件。
target_link_libraries():链接库文件。
include_directories():添加头文件目录。
link_directories():添加lib文件路径
具体使用案例:
bash
cmake_minimum_required(VERSION 3.5.1)
#生成项目的名称
project(iris_recognition)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_SUPPRESS_REGENERATION FALSE)
#设置生成release项目
set(CMAKE_BUILE_TYPE RELEASE)
set(CMAKE_CXX_STANDARD 14)
# It prevents the decay to C++98 when the compiler does not support C++14
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# It disables the use of compiler-specific extensions
# e.g. -std=c++14 rather than -std=gnu++14
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
#set library path
set(OpenCV_DIR E:/Lib/opencv470/)
message("如果目录中包含空格,请使用\对空格进行转义")
file(GLOB SOURCE_FILES src/*.cpp)
include_directories(
${OpenCV_DIR}/include
${PROJECT_SOURCE_DIR}/include
)
link_directories(
${OpenCV_DIR}/x64/vc16/lib
)
#add_library(${CMAKE_PROJECT_NAME} STATIC ${SOURCE_FILES})
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES}) #生成可执行程序 项目
add_library(iris_recognition_dll SHARED ${SOURCE_FILES}) #生成动态链接库 项目
target_link_libraries(
${CMAKE_PROJECT_NAME}
opencv_world470.lib
)
#target_link_libraries(
# mytest
# opencv_world470.lib
#)
target_link_libraries(
iris_recognition_dll
opencv_world470.lib
)
2.2 项目结构
与CMakeLists.txt相对应的目录结构如下图所示,一般来说,有include目录,src目录和CMakeList.txt文件即可。
2.3 CMake (cmake-gui)操作过程
根据配置好的CMakeLists.txt文件,CMake (cmake-gui)可将c++代码封装为可执行文件,更便捷的是CMake (cmake-gui)还可将c++代码封装为动态链接库,实现C++代码python 端的调用。在文本中,一般都是创建一个 build 用来存放 cmake 构建和编译的产物。CMake (cmake-gui)具体操作过程如下:
第一步:设置所需编译的C++代码路径和build 文件路径。
第二步:单击Configure 。
第三步:单击Generate。
完成前面三步后,CMake (cmake-gui)已经根据配置好的CMakeLists.txt文件,生成了相应的build 文件,并将cmake 构建和编译的产物存入了build文件夹中。
第四步,单击Open Projrct,即可打开Visual Studio。
如果单击Open Projrct之后反应太慢,还可直接打开创建好的build文件,直接单击生成的可执行文件,启动Visual Studio。
build 目录详情
其中iris_recognition.sln 是生成的vs项目工程文件,通过双击该文件打开项目。