CMAKE实践读书笔记(1)P1-P12

目录

关于kitware公司

关于VTK

关于KDE4

关于SVN和CVS

关于类BSD许可

Q:什么是native 编译配置文件

Q:Xcode是什么

Q:MSVC是什么

关于kdelibs和autotools

Q:什么是pkg-config

关于mkdir

关于stdio.h和iostream

main.c

CmakeLists.txt

关于MESSAGE

关于${}

Q:HELLO_BINARY_DIR和HELLO_SOURCE_DIR什么意思

Q:什么是编译目录,什么是源代码目录

Q:void*是什么,为什么要检查他的大小

Q:CMakeFiles, CMakeCache.txt, cmake_install.cmake,Makefile都是什么文件

make VERBOSE=1

IF的例外

参数使用括弧括起,参数之间使用空格或分号分开

指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。

make clean

译文

make clean和make distclean的区别

什么是内部构建,什么是外部构建


关于kitware公司

Kitware是一家软件研发服务公司,成立于1998年,总部位于美国纽约州的克利夫顿。该公司提供开源软件系统、高级研究、开发和定制软件解决方案以及技术支持等服务。其主要产品和服务包括VTK、ITK、CDash、CMake等开源软件系统和著名的HPC和计算机视觉开源软件,同时也提供各种软件开发和研发服务,包括计算机辅助设计、数值分析、机器学习、图像处理等领域。Kitware还是美国国家实验室、大学和其他研究机构的重要合作伙伴。


关于VTK

VTK(Visualization Toolkit)是一个开源、跨平台的计算机视觉和数据可视化软件系统。它提供了各种算法和工具,可以用于处理和可视化不同类型的数据,包括科学、医学、地球科学等领域的数据。

VTK是由Kitware公司开发和维护的,它支持多种编程语言,如C++、Python等,同时也提供了与其他常见计算机视觉和图形学工具的接口,如OpenGL、Qt等。VTK的开发目标是使数据可视化和处理更加简单和高效,它的用户包括学术界、工业界、医疗领域等多个领域的专业人士和研究人员。


关于KDE4

KDE4是一个开源的桌面环境,它是KDE项目的第四个主要版本,于2008年发布。KDE是K Desktop Environment(K桌面环境)的缩写,是一个以Qt框架为基础的自由桌面环境。KDE桌面环境在Linux和Unix系统中广泛使用,提供了各种各样的应用程序,如文本编辑器、图形编辑器、音乐播放器、视频播放器等。KDE4是KDE项目的一个重要版本,它带来了许多新功能和改进,包括一个新的桌面壁纸系统、新的面板和窗口管理器、增强的文件管理器和档案管理器、新的桌面搜索功能等。


关于SVN和CVS

SVN(Subversion)是一款流行的版本控制系统,可以管理文件和目录的版本控制,允许多人同时修改同一个文件而不会覆盖其他人的修改。SVN由于其简单易用和功能强大,被广泛应用于软件开发、文档管理等领域。SVN是免费开源的软件,可以在多个平台上运行,包括Windows、Linux、Mac OS等操作系统。

CVS,全称Concurrent Versions System,是一种开源的版本控制系统,早在1986年就被创建出来。它是一种集中式版本控制系统,可以帮助多个开发者协同开发一个项目。CVS使用一个专门的服务器来保存项目的所有版本信息,并允许多个开发者从这个服务器上获取最新的代码,并将自己的代码上传到服务器上,以便与其他开发者协同工作。CVS被广泛应用于开源软件开发和企业内部软件开发中,但由于其集中式架构的局限性,逐渐被更为先进的分布式版本控制系统所取代。

CVS(Concurrent Versions System)和SVN(Subversion)都是版本控制系统,用于协作开发和管理软件代码。它们的不同主要在以下几个方面:

  1. 数据存储方式:CVS使用基于文本文件的存储方式,SVN则使用基于数据库的存储方式,因此SVN的性能和稳定性更好。

  2. 分支管理:CVS的分支管理比较复杂,需要手动管理各个分支,而SVN则提供了更加灵活的分支管理方式。

  3. 操作效率:SVN比CVS更加高效,尤其在文件更改的冲突解决、文件合并等方面。

  4. 安全性:SVN提供了更加完善的身份验证和授权机制,可以更好地保护代码安全。

总的来说,SVN是CVS的一种改进版本,SVN相对于CVS提供了更好的性能、更灵活的分支管理、更好的安全性和更多的功能。


关于类BSD许可

类BSD许可(BSD License)是一种开源软件许可证,它是基于BSD Unix操作系统的一系列许可证的总称。类BSD许可证允许用户以任何目的,包括商业目的,使用软件,并且可以在任何媒体上复制和分发软件的副本。它还允许用户修改软件并将其用作专有软件的一部分,而不需要公开发布其修改的源代码。但是,类BSD许可证有一些限制,如需在源代码或二进制文件的发布中包含许可证原文,以及不能使用开源软件的名称或原始作者的名称进行宣传或推销。


Q:什么是native 编译配置文件

A:Native编译配置文件是指针对当前机器的特定硬件及操作系统环境所生成的编译配置文件。它可以通过在代码库中包含该文件来确保在不同的机器上构建相同的编译环境,以确保代码在各种平台上的可移植性和一致性。这个文件通常包括编译器选项、链接器选项、库路径和头文件路径等信息,这些信息可以在编译代码时帮助编译器正确地编译和链接代码


Q:Xcode是什么

A:Xcode是一款由苹果公司开发的集成开发环境(IDE),用于开发macOS、iOS、iPadOS、watchOS和tvOS的应用程序。Xcode提供了代码编辑器、编译器、调试器、代码分析器、性能分析器、图像和界面设计工具等开发工具,使开发者可以使用Objective-C、Swift等编程语言来开发应用程序。除此之外,Xcode还提供了许多其他的功能,如版本控制、自动化构建、应用程序分发等。


Q:MSVC是什么

A:MSVC是指微软视觉C++编译器(Microsoft Visual C++),是微软公司为Windows操作系统开发的一款C++编译器。MSVC支持多种C++标准、Windows SDK、.NET Framework等。MSVC也是Visual Studio IDE的默认编译器之一,常用于Windows下的C++开发。


关于kdelibs和autotools

kdelibs是一个KDE软件框架,提供了许多基本的功能和工具库,包括文件操作、网络、XML解析、数据库访问、GUI控件、音频、图形渲染等等。KDE开发者可以使用这些库来构建自己的应用程序,它们都是用C++编写的,具有跨平台性能和可移植性。kdelibs还包含了许多KDE桌面环境的标准应用程序,例如文件管理器Dolphin和文本编辑器Kate等。

Autotools是一组在Linux和Unix系统中生成可移植软件的工具集。它包括三个核心工具:Autoconf,Automake和Libtool。其中,Autoconf负责检查系统环境并生成configure脚本,Automake负责生成Makefile.am文件,Libtool则负责生成共享库。

使用Autotools,开发者可以在不同的Linux和Unix系统上自动生成可移植的Makefile和共享库,简化了跨平台开发的过程。它是许多开源项目使用的构建系统之一,如GNU工具集、KDE、GIMP等。

Kdelibs是一个开源的软件库,它提供了一些常用的软件功能,比如文件操作、网络通信等,同时也提供了一些高级的功能,比如XML解析、音频处理等。而autotools是一组用于软件构建、配置和安装的自动化工具,它可以帮助程序员更方便地管理代码、处理依赖关系、生成配置文件等。

在KDE的开发中,通常会使用autotools来进行自动化构建和配置,而kdelibs则是一个被包含在KDE中的库文件,提供了一些KDE应用程序开发所需要的基础功能。因此,它们之间可以看作是依赖关系,即KDE应用程序的开发需要依赖于kdelibs提供的基础库函数,同时也需要使用autotools进行构建和配置。


Q:什么是pkg-config

A:pkg-config是一个计算机程序,用于检索安装在计算机上的库的元数据,例如库的名称、版本、安装路径和编译选项等。它可以自动地为应用程序的编译和链接操作提供正确的编译器选项,以便在开发时正确地链接到依赖的库。使用pkg-config可以使编译、链接库更加方便和自动化。


关于mkdir

mkdir -p 是一个在 Unix 和类 Unix 系统中常用的命令,用于创建一个目录。 -p 选项表示递归创建目录,即如果目录的上级目录不存在,则会先创建上级目录。如果目录已经存在,也不会报错。例如,mkdir -p /home/user/data/ 将会创建 /home/user//home/user/data/ 两个目录,如果 /home/user/ 目录已经存在,那么只会创建 /home/user/data/ 目录。


关于stdio.h和iostream

stdio.hiostream都是C++中输入输出的库文件。

stdio.h是C语言中的头文件,包含了很多输入输出函数的定义,例如printf()scanf()等。在C++中,这些函数也可以使用,并且可以通过#include 的方式进行调用。

iostream是C++中的输入输出流库,包含了cincoutcerrclog等流对象,以及对应的一系列操作符重载函数。C++中推荐使用iostream库进行输入输出操作,因为它提供了更多的类型安全性和面向对象的特性。iostream可以通过#include 的方式进行调用。

在C++中可以用#include 代替#include ,但是在C++中使用头文件需要使用C的方式进行读写文件,使用起来较为繁琐,不如使用C++中的库方便。而且使用库更符合C++的面向对象的设计思想。因此,在C++中一般都使用库。


main.c

//main.c
#include 
int main()
{
printf(“Hello World from t1 Main!\n”);
return 0;
}

这是一个简单的C语言程序,输出一句话"Hello World from t1 Main!",并返回0。


CmakeLists.txt

PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello SRC_LIST)

这是一个 CMakeLists.txt 文件,用于构建一个名为 "hello" 的可执行文件,其中包含一个名为 "main.c" 的源文件。以下是各行代码的作用:

  • PROJECT (HELLO):创建一个名为 "HELLO" 的项目。
  • SET(SRC_LIST main.c):定义一个名为 "SRC_LIST" 的变量,它包含一个名为 "main.c" 的源文件。在CMake中,使用SET命令声明变量时,默认情况下它们都是字符串类型变量。因此,SET(SRC_LIST main.c)SRC_LIST变量设置为字符串类型,其值为main.c
  • MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}):在构建过程中打印一条消息,其中包含构建目录的路径。
  • MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}):在构建过程中打印一条消息,其中包含源代码目录的路径。
  • ADD_EXECUTABLE(hello SRC_LIST):创建一个名为 "hello" 的可执行文件,并将 "SRC_LIST" 变量中的源文件编译为目标文件,然后将目标文件链接到可执行文件中。

关于MESSAGE

MESSAGE是一个CMake命令,用于在终端输出一些信息。它可以用来打印调试信息、确认变量的值等等。常用的语法格式为:MESSAGE([] "message to display" ...)。

其中mode是可选的参数,用于指定输出信息的类型。常用的类型有STATUS(输出一般的状态信息)、WARNING(输出警告信息)和FATAL_ERROR(输出错误信息,并停止构建过程)等。message to display是要输出的信息,可以是变量、字符串或表达式等。...表示可以输出多个信息,中间用空格分隔。


关于${}

在CMake中,${}用于引用变量的值。它可以将变量的值嵌入到一个字符串中,类似于字符串拼接的操作。例如,${HELLO_BINARY_DIR}会被替换为HELLO项目的二进制目录。这种语法类似于bash shell中的变量引用${VAR}


Q:HELLO_BINARY_DIR和HELLO_SOURCE_DIR什么意思

A:HELLO_BINARY_DIRHELLO_SOURCE_DIR 是 CMake 自带的两个变量,分别表示编译目录和源代码目录的路径。其中,HELLO_BINARY_DIR 表示当前项目的构建目录,HELLO_SOURCE_DIR 表示当前项目的源代码目录。

在 CMake 中,使用 ${} 语法可以访问变量的值。${HELLO_BINARY_DIR} 就表示 HELLO_BINARY_DIR 变量的值,${HELLO_SOURCE_DIR} 就表示 HELLO_SOURCE_DIR 变量的值。


Q:什么是编译目录,什么是源代码目录

A:

编译目录和源代码目录都是在项目文件夹下的不同文件夹。

编译目录通常包含生成的可执行文件、库文件和中间文件等,以及CMake生成的相关配置文件,例如Makefile、CMakeCache.txt等,该目录在构建项目时自动生成。

源代码目录是包含项目源代码的目录,通常包含各种头文件、C++源文件、C源文件等。该目录在项目创建时就已经存在。

通常情况下,源代码目录和编译目录是分离的,即源代码目录中的文件并不会被修改,所有修改都会在编译目录中生成。这样可以方便地保持源代码目录的干净和整洁,方便版本管理和备份。同时也可以在多个编译目录中生成不同版本的可执行文件和库文件,方便调试和测试。


-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- This is BINARY dir /backup/cmake/t1
-- This is SOURCE dir /backup/cmake/t1
-- Configuring done 
-- Generating done
-- Build files have been written to: /backup/cmake/t1

这段代码是使用CMake工具生成的编译配置文件的输出结果,输出了以下信息:

  • 检查C编译器/usr/bin/gcc是否可用,并确认它工作正常;
  • 检查void*的大小;
  • 检查C++编译器/usr/bin/c++是否可用,并确认它工作正常;
  • 输出了生成二进制文件的目录位置;
  • 输出了源代码的目录位置;
  • 配置完成并且生成文件完成;
  • 编译文件已经写入到/backup/cmake/t1目录中。

可以看出,这些信息告诉我们在编译过程中的一些关键参数和信息,以及生成的目标文件的位置等信息。


Q:void*是什么,为什么要检查他的大小

A:void*是C++中的指针类型,它可以指向任意类型的数据。因为指针的大小是与机器的体系结构和操作系统相关的,所以在一些情况下需要检查void*指针的大小。

在CMake的配置阶段中,通常需要检查void*指针的大小,以便在编译和链接阶段使用正确的指针大小。这个过程是通过使用CheckTypeSize模块来实现的。

CheckTypeSize 是 CMake 的一个内置模块(module),用于检查指定类型的大小(以字节为单位)。它使用编译器编译一个简单的测试程序,通过编译过程中的错误或者输出,来得到类型的大小。


Q:CMakeFiles, CMakeCache.txt, cmake_install.cmake,Makefile都是什么文件

A:

这些文件是 CMake 编译系统在构建过程中生成的文件。

  • CMakeFiles:这个目录包含编译过程中生成的临时文件和编译输出的二进制文件。
  • CMakeCache.txt:这个文件包含了 CMake 的配置信息,包括设置的变量和选项等,可以通过编辑这个文件来修改 CMake 的配置。
  • cmake_install.cmake:这个文件是一个安装脚本,用于在执行 make install 命令时将构建结果安装到指定目录。
  • Makefile:这个文件包含了构建过程中的编译指令和规则,可以通过 make 命令来执行编译和链接操作。

Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/main.o
Linking C executable hello
[100%] Built target hello

这段信息来自CMake的Makefile生成过程中的编译和链接过程。首先,CMake扫描了目标“hello”的依赖项,然后生成了一个名为“main.o”的目标文件。接下来,CMake将“main.o”链接到一个名为“hello”的可执行文件中。最后,CMake报告已成功构建目标“hello”。


make VERBOSE=1

make VERBOSE=1是一个命令,它用于在编译过程中显示详细的输出信息,包括编译器和链接器的命令、编译选项、源文件和目标文件的名称等。通过使用这个命令,可以更好地了解编译过程中发生的事情,诊断和解决错误。

在执行Makefile中的命令时,VERBOSE标志可以用来控制输出的详细程度。默认情况下,它是关闭的,只会输出必要的信息,例如正在进行的操作和任何错误信息。如果将VERBOSE标志设置为1或true,则会输出更详细的信息,例如命令的输出和命令之间的依赖关系。这对于调试Makefile时非常有用。可以使用以下命令来启用VERBOSE标志:

make VERBOSE=1


IF的例外

例外,比 如在 IF 控制语句,变量是直接使用变量名引用,而不需要${}。如果使用了${}去应用变 

量,其实 IF 会去判断名为${}所代表的值的变量,那当然是不存在的了。 


参数使用括弧括起,参数之间使用空格或分号分开


指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。


make clean

make clean 是一个命令,用于清除已经编译的目标文件、可执行文件以及其他生成的文件,以便重新编译程序。具体操作会删除当前目录下生成的目标文件、可执行文件和其他生成的文件,但不会删除源文件。这个命令通常在重新编译项目之前运行,以确保之前的编译结果不会干扰新的编译过程。


译文

一些用 GNU autotools 创建的构建树有一个 "make distclean "目标,它可以清理构建,也可以删除 Makefiles 和生成的构建系统的其他部分。CMake没有生成 "make distclean "目标,因为CMakeLists.txt文件可以运行脚本和任意命令;CMake没有办法准确跟踪哪些文件是作为运行CMake的一部分而生成的。提供一个distclean目标会给用户一个错误的印象,即它会按照预期工作。(CMake确实生成了一个 "make clean "目标来删除由编译器和链接器生成的文件)。 只有在用户进行源内构建时才需要 "make distclean "目标。CMake支持源内构建,但我们强烈鼓励用户采用源外构建的概念。使用与源码树分离的构建树将防止CMake在源码树中生成任何文件。因为CMake不改变源树,所以不需要distclean目标。我们可以通过删除构建树或创建一个独立的构建树来开始新的构建。


make clean和make distclean的区别

make clean通常用于清除目标文件(.o文件)和可执行文件,以便重新构建程序,而不会影响生成的其他文件,如静态库、动态库等。而make distclean通常会清除make clean不会清除的文件,如编译生成的中间文件、Makefile等。这通常用于彻底清除所有生成的文件以进行干净的重新构建。


什么是内部构建,什么是外部构建

在使用CMake进行项目构建时,有内部构建和外部构建两种方式。

内部构建是指在源代码目录中创建一个新的子目录,即构建目录,用于生成Makefile和构建结果等。这样做的好处是构建目录与源代码目录分离,保持了代码目录的清晰和干净,同时可以在同一代码目录中使用多个不同的构建目录,比如可以生成不同的构建配置和生成器。内部构建通常是通过在CMake中指定构建目录来实现的。

外部构建则是指在不同的目录中进行构建。即使外部构建目录在不同的机器上,也可以使用相同的CMakeList文件进行构建。这样可以方便地构建相同的项目在多个不同的系统或平台上。外部构建的一个好处是可以避免在源代码目录中产生构建结果,从而使源代码目录保持干净,同时可以避免因构建目录与源代码目录混淆而导致的问题。外部构建通常是通过在CMake中指定生成Makefile的目录来实现的。


通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即/backup/cmake/t1

而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build


你可能感兴趣的:(CMAKE实践读书笔记,c++)