目录

Q:介绍一些常见的Linux系统

Q:Kinect是什么

Q:什么是编译器

Q:GNU是什么

Q:GNUME桌面环境是什么

Q:gedit是什么

Q:unix和Linux有什么关系和不同

Q:什么是vim

g++ helloSLAM.cpp

command not found

Q:什么是g++

sudo apt-get install g++

./a.out

chmod

chmod的权限

chmod u+rwx,go+rx file.txt

Q:什么是cmake

Q:什么是makefile文件

Q:什么是CMakeLists.txt文件

Q:makefile和cmake有什么关系和不同

slambook2/ch2/CMakeLists.txt

关于project指令的若干问题

cmake_minimum_required

set(CMAKE_BUILD_TYPE "Debug")

Q:CMAKE_BUILD_TYPE都有哪几种模式

set指令

Q:在cmake中,PATH是什么

Q:set指令中有哪些,他们对应哪些

Q:PATH和FILEPATH有什么区别

CACHE变量

add_executable指令

add_library指令

Q:什么是EXCLUDE_FROM_ALL,什么是make all

Q:静态库的扩展名就是.a,动态库的扩展名就是.so吗

关于make all

STATIC、SHARED和MODULE

target_link_libraries

cmake .

make

scanning dependencies of target helloslam

building cxx object cmakefiles/helloslam.dir/helloslam.cpp.o

linking cxx executable helloslam

built target helloslam


Q:介绍一些常见的Linux系统

A:

  1. Ubuntu:基于Debian的Linux发行版,非常流行,适合新手使用。
  2. Fedora:基于Red Hat的Linux发行版,注重最新的开源软件,用于工作站、服务器和云计算。
  3. Debian:老牌Linux发行版,以稳定性著称,被广泛用于服务器和桌面系统。
  4. CentOS:基于Red Hat企业版Linux的开源克隆版,用于服务器。
  5. Arch Linux:面向Linux专业人员的轻量级Linux发行版,注重自由和灵活性。
  6. openSUSE:基于SUSE Linux Enterprise的Linux发行版,可用于桌面和服务器系统。
  7. Kali Linux:用于网络安全和渗透测试的Linux发行版。
  8. Gentoo:Linux发行版的源代码自动编译工具,适合高级用户和专业人员使用。

Q:Kinect是什么

A:Kinect是微软开发的一款3D深度相机,它可以通过投射红外线点阵和红外线相机的组合来获取深度图像。同时,Kinect也包括一个普通彩色相机和一个麦克风阵列,用于捕捉环境的音频和视频信息。这种相机可以用于人体姿态识别、运动追踪、室内定位、虚拟现实等领域。在机器人领域,Kinect也被广泛应用于SLAM、点云地图构建、物体识别等方面。


Q:什么是编译器

A:编译器是一种将源代码转换为目标代码的计算机程序。源代码通常是使用高级编程语言编写的人类可读文本,而目标代码是计算机可执行的二进制代码。编译器将源代码翻译成目标代码,使计算机能够理解和执行程序。编译器通常包括预处理器、编译器、汇编器和链接器等组件,它们一起将源代码转换为可执行的目标代码。


Q:GNU是什么

A:GNU指的是GNU's Not Unix的缩写,是一个自由软件操作系统,由Richard Stallman发起开发,旨在创建一个自由的类Unix操作系统。GNU系统的组件包括操作系统内核(GNU Hurd),shell、编译器、图形界面、文本编辑器等等。GNU是一个完全自由和开源的系统,其代码可以自由地使用、复制、修改和分发。很多Linux发行版使用了GNU组件。


Q:GNUME桌面环境是什么

A:GNOME(GNU Network Object Model Environment)是一个基于自由软件的桌面环境,提供了一个直观、吸引人的桌面体验。它是由GNU计划开发的一部分,并受到GNU通用公共许可证(GPL)的保护。GNOME桌面环境提供了一个可自定义的用户界面,包括面板、窗口管理器、文件管理器、系统工具等,使得用户可以更加方便地使用和管理自己的计算机。它还提供了很多应用程序和工具,例如文本编辑器、终端、图形图像编辑器、音乐播放器等,以满足不同用户的需求。


Q:gedit是什么

A:gedit是一款开源的文本编辑器,它是GNOME桌面环境的一部分,也可以在其他桌面环境中使用。gedit支持多种编程语言,包括C、C++、Java、Python、HTML、CSS等等,并提供语法高亮、代码折叠、自动缩进、自动完成等功能,可以方便地编辑代码、配置文件等文本文件。gedit还支持插件扩展,可以通过安装插件来扩展其功能。


Q:unix和Linux有什么关系和不同

A:

Unix和Linux都是操作系统。Unix是一种开放的、多用户的、多任务的操作系统,于1969年由贝尔实验室开发。Linux则是一种基于Unix的、开源的、免费的操作系统,最初由芬兰学生Linus Torvalds开发并于1991年发布。

尽管Linux是基于Unix操作系统的,但两者之间也有不同之处。其中一些不同之处包括:

  1. 开发者:Unix是由贝尔实验室的开发人员开发的,而Linux则是由Linus Torvalds和全球各地的志愿者开发的。
  2. 版权:Unix是一个商业操作系统,必须购买许可证才能使用,而Linux是免费且开源的。
  3. 内核:Linux和Unix的内核略有不同,因此它们处理某些操作的方式也略有不同。
  4. 应用程序:Linux和Unix操作系统可以运行相同的应用程序,但它们在支持某些应用程序方面可能会有所不同。
  5. 用户界面:Linux操作系统通常使用GNOME、KDE等图形用户界面,而Unix则通常使用CDE、X Window System等。

总之,虽然Unix和Linux之间存在一些不同之处,但它们都是强大的操作系统,被广泛用于服务器、工作站和个人计算机中。


Q:什么是vim

A:vim是一种文本编辑器,是Unix和类Unix系统中广泛使用的一种文本编辑器。vim是从vi(Visual Editor)发展而来的,因此vim的全称是Vi IMproved(Vi改进版)。和vi一样,vim是一个命令行程序,但它也提供了图形界面。vim的设计初衷是让用户可以快速编辑文本,因此它拥有丰富的命令和快捷键,可以让用户快速进行编辑操作。vim支持多种文件格式,可以编辑纯文本、代码等多种类型的文件。由于vim功能强大、高效,因此在程序员和系统管理员中广泛使用。


g++ helloSLAM.cpp

这是一个在Linux操作系统下使用g++编译器编译名为"helloSLAM.cpp"的C++程序的命令。g++是GNU C++编译器的一个前端命令,它可以把C++源代码编译成可执行文件。执行该命令后,会在当前目录下生成一个名为"a.out"的可执行文件。

在使用g++编译器编译源代码生成可执行文件时,默认情况下可执行文件的名称为a.out。如果想要自定义可执行文件名称,可以使用-o选项。具体地,使用以下命令即可将可执行文件名定为myprogram

g++ -o myprogram helloSLAM.cpp

其中,-o选项后面紧跟着的是自定义的可执行文件名称。

在Linux系统中,可执行文件没有固定的扩展名,可以没有扩展名或者是任何合法的文件名。通常情况下,可执行文件会被赋予可执行权限(使用chmod命令),然后通过在终端中输入文件名来运行它。生成的可执行文件名称为"myprogram",不需要加上".out"后缀,可以直接执行。可以在终端输入"./myprogram"来执行该程序。


command not found

这个错误通常表示系统无法找到输入的命令或可执行文件。可能是因为没有正确安装相应的软件包或工具,或者输入的命令名称有误。

可以尝试以下解决方案:

  1. 检查输入的命令名称是否正确。确保没有拼写错误或语法错误。

  2. 检查是否正确安装了相应的软件包或工具。可以尝试重新安装软件包或使用包管理器安装相应的工具。

  3. 检查的环境变量是否正确配置。确保PATH环境变量包含了您需要使用的命令所在的路径。


Q:什么是g++

A:g++是GNU编译器套件中的一个C++编译器,可用于将C++源代码编译为可执行文件。它支持C++11和C++14标准,可以在Linux、macOS和Windows等操作系统上使用。g++也是许多集成开发环境(IDE)中默认的C++编译器。


sudo apt-get install g++

这个命令会在Ubuntu系统上安装g++编译器,g++是C++编译器的一种。sudo命令用于以管理员身份运行命令。apt-get命令用于从Ubuntu软件存储库中安装软件。

  • sudo是Linux下的一个命令,用于以超级用户身份运行命令。
  • apt-get是Debian及其衍生发行版(如Ubuntu)上的一个命令行工具,用于管理软件包。通过apt-get,用户可以搜索、安装、更新和卸载软件包。

    apt是Advanced Package Tool的缩写,是Debian和Ubuntu等Linux操作系统中的包管理器,用于管理系统中的软件包,包括安装、卸载、更新等操作。

    get在这里是指命令的一部分,用于从软件源中获取软件包并下载安装。完整的命令是apt-get,通常与其他参数一起使用,例如安装软件包时使用apt-get install,更新软件源使用apt-get update等。

  • install是apt-get命令的一个选项,表示安装一个或多个软件包。在sudo apt-get install命令中,它告诉apt-get命令安装指定的软件包,例如g++

./a.out

./a.out是Linux系统下执行编译好的可执行程序的命令。在Linux系统中,当使用g++或者gcc编译源代码后,会生成一个名为a.out的可执行程序,默认情况下执行该程序的命令就是./a.out。在执行前,需要使用chmod +x a.out命令将a.out设置为可执行文件。如果想要自定义可执行文件名称,可以使用-g选项指定可执行文件名称,例如:g++ -o myprogram main.cpp,这样生成的可执行文件名称就是myprogram。


chmod

chmod是一个命令行工具,用于更改Linux和Unix系统上文件或目录的访问权限。它是change mode的缩写。它允许用户设置文件的读、写和执行权限,也可以设置所有者、用户组和其他用户的权限。

chmod的语法是:

chmod [mode] [file]

其中,mode是指要设置的权限,可以使用数字形式(如777)或符号形式(如rwxrwxrwx)。file是要更改权限的文件或目录。

例如,要将file.txt的所有者权限设置为可读可写可执行,用户组和其他用户权限都为只读,可以使用以下命令:

chmod 744 file.txt

其中,数字7表示所有者具有读、写和执行权限,数字4表示用户组和其他用户只有读权限。


chmod的权限

在Linux和Unix系统中,每个文件和目录都有一个权限位,用于限制用户和程序对其访问和操作的权限。权限位由数字和符号两种形式表示。

数字形式: 每个文件和目录的权限位由3。其中,每个数字分别表示用户(Owner)、用户组(Group)和其他用户(Other)的权限。每个数字可以是0~7之间的整数,分别表示不同的权限:

  • 0:没有权限
  • 1:执行权限
  • 2:写权限
  • 3:写和执行权限
  • 4:读权限
  • 5:读和执行权限
  • 6:读和写权限
  • 7:读、写和执行权限

符号形式: 另一种表示权限的方法是符号形式,使用字符来表示不同的权限。符号形式的权限分为三部分,分别表示用户、用户组和其他用户的权限。每部分由下列符号中的一个或多个组成:

  • r:读权限
  • w:写权限
  • x(execute):执行权限
  • -:没有权限

每个符号形式的权限字符串由九个字符组成,前三个字符表示用户权限,接下来三个字符表示用户组权限,最后三个字符表示其他用户的权限。例如,rwxr-xr-- 表示文件所有者具有读、写、执行权限,用户组具有读和执行权限,其他用户只有读权限。

使用chmod命令可以更改文件和目录的权限。例如,chmod 755 file.txt 将文件 file.txt 的权限设置为-rwxr-xr-x。其中,755是数字形式的权限表示,也可以使用符号形式的权限表示进行设置,例如,chmod u+rwx,go+rx file.txt 将文件 file.txt 的权限设置为-rwxr-xr-x。


chmod u+rwx,go+rx file.txt

这个命令是用来改变文件file.txt的权限的。其中:

  • chmod是改变文件权限的命令。
  • u+rwx表示给文件所有者(user)添加读、写、执行权限(rwx)。
  • go+rx表示给用户所在组(group)和其他用户(others)添加读和执行权限(rx)。
  • file.txt是要修改权限的文件名。

因此,该命令的含义是:给文件所有者添加读、写、执行权限,给用户所在组和其他用户添加读和执行权限。


Q:什么是cmake

CMake是一个跨平台的开源构建工具,它可以自动生成与操作系统、编译器和第三方库相关的Makefile文件,从而简化了软件的构建过程。使用CMake可以大大简化代码的构建和管理,特别是对于大型项目而言,它可以轻松地处理各种依赖关系、安装文件和测试文件等问题。

CMake的配置文件是CMakeLists.txt文件,通过在这个文件中指定项目的源代码、编译选项、链接库、安装规则等信息,CMake可以根据不同的平台和编译器自动生成相应的Makefile文件,使得项目的编译和构建更加灵活和方便。同时,CMake还支持多种编译器和构建系统,如Visual Studio、Xcode、Eclipse和Make等


Q:什么是makefile文件

Makefile是一个用于自动化编译的文件,其中包含一系列规则,指定了如何编译和链接源代码以生成目标二进制文件。Makefile文件通常由make命令使用,它会检查文件的修改时间和依赖关系,以确定哪些文件需要重新编译,并且按照Makefile中指定的规则进行编译和链接。Makefile可以大大简化软件项目的构建过程,使开发人员可以快速构建、测试和部署代码。


Q:什么是CMakeLists.txt文件

CMakeLists.txt文件是CMake工具的配置文件,用于描述如何构建、编译和链接一个项目。它包含了一系列的命令和参数,用于指定源代码文件、头文件、库文件、编译选项、链接选项等等,从而生成Makefile文件。CMakeLists.txt文件通常放置在项目的根目录下,使用CMake工具可以在不同的操作系统和编译环境中自动生成相应的Makefile文件,以便进行构建和编译。CMake的优点是可以生成多种不同的编译系统(如make、ninja、Visual Studio等),在不同的平台上都可以使用,大大提高了代码的可移植性。


Q:makefile和cmake有什么关系和不同

A:

Makefile和CMake都是用于自动化构建和管理项目的工具,它们的目标是使项目构建和管理变得更加容易和可靠。它们之间的关系是,CMake可以自动生成Makefile,而Makefile则是一种手动编写的文件,用于定义构建过程和依赖关系。

Makefile需要手动编写,使用Make工具进行构建。Makefile中指定了构建目标、依赖关系、命令等,由Make工具按照Makefile中的规则进行构建。

CMake可以自动生成Makefile,它提供了一种更加简单、灵活的方式来管理项目构建和依赖关系。CMakeLists.txt文件是CMake的配置文件,其中定义了项目名称、版本、编译选项、依赖库等信息。CMake会根据这些信息生成Makefile文件,然后使用Make工具进行构建。

相对于Makefile,CMake具有更加灵活、简单、可移植的特点。它可以生成不同平台下的不同类型的构建文件,例如Makefile、Visual Studio工程文件、Xcode工程文件等。此外,CMake还可以自动检测系统环境和依赖库,并根据环境变量进行配置。这使得跨平台项目的构建变得更加容易。

CMake是通过读取和解析CMakeLists.txt文件来生成相应的Makefile或者是其他构建系统的配置文件的。在CMakeLists.txt中,可以定义编译器选项、头文件路径、库路径、源代码文件等等。同时,CMake也可以自动生成构建脚本,从而提供了一个跨平台的自动化编译环境。


slambook2/ch2/CMakeLists.txt

# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)# 声明一个 cmake 工程
project(HelloSLAM)# 设置编译模式
set(CMAKE_BUILD_TYPE "Debug")# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable(helloSLAM helloSLAM.cpp)# 添加hello库
add_library(hello libHelloSLAM.cpp)
# 共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)# 添加可执行程序调用hello库中函数
add_executable(useHello useHello.cpp)
# 将库文件链接到可执行程序上
target_link_libraries(useHello hello_shared)

这是一个典型的 CMakeLists.txt 文件,具体解释如下:

  1. cmake_minimum_required(VERSION 2.8):声明需要的 CMake 最低版本为 2.8,如果版本低于此,将不能使用本文件。

  2. project(HelloSLAM):声明这是一个 CMake 工程,命名为 HelloSLAM。

  3. set(CMAKE_BUILD_TYPE "Debug"):设置编译模式为 Debug,这将会告诉编译器在编译过程中生成调试信息,便于调试程序。

  4. add_executable(helloSLAM helloSLAM.cpp):添加一个可执行程序,名字为 helloSLAM,源代码文件为 helloSLAM.cpp。

  5. add_library(hello libHelloSLAM.cpp):添加一个静态库,名字为 hello,源代码文件为 libHelloSLAM.cpp。

  6. add_library(hello_shared SHARED libHelloSLAM.cpp):添加一个共享库,名字为 hello_shared,源代码文件为 libHelloSLAM.cpp。

  7. add_executable(useHello useHello.cpp):添加一个可执行程序,名字为 useHello,源代码文件为 useHello.cpp。

target_link_libraries(useHello hello_shared):将库文件 hello_shared 链接到可执行程序 useHello 上,这样 useHello 就可以调用 hello_shared 中的函数了。


关于project指令的若干问题

project(HelloSLAM)声明了这是一个CMake工程,并命名为HelloSLAM,但不是指生成一个名为helloslam的可执行文件。add_executableadd_library指令用于声明要生成的可执行文件或库文件的名称和源代码文件,而target_link_libraries用于将库文件链接到可执行文件上。在该示例中,生成了三个可执行文件(helloSLAMuseHello)和两个库文件(hellohello_shared)。

project(HelloSLAM) 是用来声明一个 CMake 工程,并指定工程名称为 HelloSLAM。它不是用来生成可执行文件的命令,而是在 CMakeLists.txt 中定义项目的基本信息和设置。在本例中,实际上是通过 add_executable(helloSLAM helloSLAM.cpp) 来生成一个名为 helloSLAM 的可执行文件。

在 CMakeLists.txt 中,通过 project 指令声明一个 CMake 工程,其中包括项目名称、版本号、语言等信息,同时也会指定生成的可执行文件或库文件的名称。如果没有 project 指令,CMake 将不知道如何命名该项目,并且生成的 Makefile 或者其他构建工具的配置文件也将缺少必要的信息。

因此,如果没有 project 指令,CMake 将无法将其识别为 CMake 工程,并生成对应的构建工具的配置文件。

project指令是用于指定当前 CMakeLists.txt 所在目录下的 CMake 工程的名称。这个名称通常被用作默认的构建目标名称,并且在配置和生成过程中也会用到。因此,这个指令并不是用来指定可执行文件的名称的,而是用来命名 CMake 工程的。如果没有指定 project 指令,CMake 将会默认使用当前目录的名称来命名 CMake 工程。


cmake_minimum_required

cmake_minimum_required是CMake指令之一,用于指定所需的CMake的最低版本。它的语法如下:

cmake_minimum_required(VERSION <version>)

例如,cmake_minimum_required(VERSION 3.10)指定了需要CMake 3.10版本或更高版本才能构建项目。如果系统上安装的CMake版本低于指定的最低版本,则会产生错误,CMake将无法继续构建项目。


set(CMAKE_BUILD_TYPE "Debug")

set(CMAKE_BUILD_TYPE "Debug") 指令是用来设置编译的模式,这里将编译模式设置为 Debug。编译模式是指编译器编译程序时使用的编译选项和优化级别等配置,通常包括 Debug、Release、RelWithDebInfo、MinSizeRel 等几种模式。Debug 模式通常用于调试阶段,会生成调试信息和关闭优化,而 Release 模式则是用于生产环境,会开启优化以提高程序性能。


Q:CMAKE_BUILD_TYPE都有哪几种模式

A:

CMAKE_BUILD_TYPE 是 CMake 预定义的一个变量,用于指定编译的模式。常见的编译模式包括:

  • Debug:以调试模式编译,包含调试信息,并开启调试相关的编译选项。
  • Release:以发布模式编译,优化代码以提高执行速度,并省略调试信息等。
  • RelWithDebInfo:发布模式下包含调试信息。
  • MinSizeRel:发布模式下最小化可执行文件体积。

当然,具体的编译模式和对应的编译选项可能因不同的项目而异,可以在 CMakeLists.txt 文件中根据需要进行自定义。


set指令

set是CMake中的一个指令,用于设置变量的值。在CMakeLists.txt中使用set指令可以创建一个变量并给它赋值,也可以修改一个已经存在的变量的值。语法如下:

set(<variable> <value>... [CACHE <type> <docstring> [FORCE]])

其中:

  • <variable>:要设置的变量名。
  • <value>:要为变量设置的值。
  • CACHE:可选参数,用于将变量缓存起来以便在后续的CMake运行中使用。当第一次运行CMake时,该变量的值会被设置为默认值或缓存值。在后续的CMake运行中,如果没有明确设置该变量的值,则该变量的值将使用缓存值。
  • <type>:可选参数,用于指定变量的类型。常用的类型有BOOLSTRINGPATH等。
  • <docstring>:可选参数,用于为变量提供说明文档。
  • FORCE:可选参数,如果在命令行或缓存中已经设置了该变量,则使用该参数强制更新变量的值。

例如,set(CMAKE_BUILD_TYPE "Debug")用于将变量CMAKE_BUILD_TYPE的值设置为Debug,这将启用调试信息和关闭优化。


Q:在cmake中,PATH是什么

A:在CMake中,PATH是一种变量类型,用于表示文件路径。和STRINGBOOL不同,PATH类型会进行一些特殊处理来确保路径的正确性,例如自动添加路径分隔符,检查路径是否存在等等。这使得使用PATH类型的变量更加方便,可以避免一些常见的路径问题。


Q:set指令中有哪些<variable>,他们对应哪些 <value>

A:

在set指令中,<variable> 表示变量名,可以是任何自定义的变量名,而 <value> 表示变量的值,可以是以下类型之一:

  • BOOL:布尔值,取值为 TRUE 或 FALSE。
  • PATH:路径类型,表示一个路径。
  • STRING:字符串类型,表示一个字符串。
  • FILEPATH:文件路径类型,表示一个文件路径。
  • INTERNAL:内部类型,表示只在 CMakeLists.txt 文件内部使用的变量。
  • CACHE:缓存类型,表示 CMake 缓存中的变量。
  • UNINITIALIZED:未初始化类型,表示变量尚未初始化,需要在后续设置。

当设置变量时,可以根据变量的类型来设置相应的值。例如,对于 BOOL 类型的变量,可以设置为 TRUE 或 FALSE;对于 PATH 类型的变量,可以设置为一个路径字符串,例如 "/usr/local/bin"。同时,还可以将变量设置为其他类型的值,例如将一个 STRING 类型的变量设置为一个路径字符串,但这样可能会导致问题。


Q:PATH和FILEPATH有什么区别

A:

在CMake中,PATHFILEPATH都是变量类型。它们的区别在于:

  • PATH变量类型表示一个路径,可以是绝对路径或相对路径。
  • FILEPATH变量类型表示一个文件路径,必须是一个绝对路径。

在使用set指令时,可以将变量类型指定为PATHFILEPATH,如下所示:

set(<variable> <value> CACHE PATH "description")
set(<variable> <value> CACHE FILEPATH "description")

其中CACHE表示将变量缓存到CMakeCache.txt文件中,"description"是变量的描述信息。


CACHE变量

在CMake中,CACHE变量是一种特殊类型的变量,用于存储用户设置的值,以便在重新运行CMake时保留值。可以使用set(<variable> <value> CACHE <type> <docstring> [FORCE])命令创建一个缓存变量。

当CMake第一次配置时,如果变量不存在,则将其设置为默认值,并将其存储在缓存中。如果变量已经存在于缓存中,则将其保留,并使用缓存中的值。用户可以通过CMake GUI或者命令行修改缓存变量的值。

在实际使用中,CACHE变量常用于控制构建过程中的选项和参数,如编译器选项、安装路径、库的位置等。在每次重新运行CMake时,可以使用CACHE变量来保留用户的选择和配置,从而更轻松地管理和重现构建过程。

需要注意的是,如果在设置CACHE变量时没有使用FORCE选项,则缓存变量只有在第一次运行CMake时才能被修改,而在后续运行中将保持不变。如果需要在后续运行中修改缓存变量,则必须使用FORCE选项。


add_executable指令

add_executable是一个CMake指令,用于将源文件编译成可执行文件。它的语法为:

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL]source1 [source2 ...])

其中,name是可执行文件的名称,可以是任何合法的文件名。WIN32MACOSX_BUNDLE是可选项,表示生成的可执行文件是Windows或MacOSX专用的。EXCLUDE_FROM_ALL是另一个可选项,表示生成的可执行文件不会被默认构建,需要手动指定。source1source2等参数是要编译的源文件列表。

例如,下面的代码将名为myprogram的可执行文件编译出来:

add_executable(myprogram main.cpp foo.cpp bar.cpp)

在执行cmakemake命令后,会生成一个名为myprogram的可执行文件。


add_library指令

add_library是CMake中的一个命令,用于将源文件编译为静态库或动态库。它的语法如下:

add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])

其中,<name>表示库的名称,可以包含路径,如lib/mylibSTATICSHAREDMODULE分别表示静态库、共享库和模块。如果不指定,则默认为STATICEXCLUDE_FROM_ALL表示将该库从make all的构建目标中排除。

add_library命令将源文件编译为库文件,并生成对应的构建规则。在生成的构建规则中,会包含编译源文件、链接库文件等操作。使用target_link_libraries命令可以将库文件链接到其他目标中,如可执行文件或其他库文件。

示例:

# 编译静态库libhello.a,包含hello.cpp和world.cpp两个源文件
add_library(hello STATIC hello.cpp world.cpp)# 编译共享库libhello.so,包含hello.cpp和world.cpp两个源文件
add_library(hello_shared SHARED hello.cpp world.cpp)# 将hello库链接到可执行程序中
add_executable(hello_demo main.cpp)
target_link_libraries(hello_demo hello)

这个示例中,add_library命令分别将hello.cppworld.cpp编译成了静态库libhello.a和共享库libhello.so,然后使用target_link_libraries命令将hello库链接到了可执行程序hello_demo中。


Q:什么是EXCLUDE_FROM_ALL,什么是make all

A:

在 CMake 中,EXCLUDE_FROM_ALL 是一个可选参数,可用于 add_executable()add_library() 指令中。它告诉 CMake 在使用 make 命令构建项目时,该目标是否需要被构建。如果目标被标记为 EXCLUDE_FROM_ALL,那么它将不会被默认构建。

例如,假设你的项目中有一个可执行目标 app 和一个静态库目标 lib,而 app 依赖于 lib,但是你只想构建 lib,而不想构建 app。在这种情况下,你可以使用 EXCLUDE_FROM_ALL 标记 app,这样 make all 命令就不会构建 app 了。

make all 是一个常用的命令,它通常用于构建整个项目中的所有目标。在 CMake 中,如果你没有显式地指定构建目标,make 命令将默认构建名为 all 的目标。因此,如果你的项目中有一个名为 all 的目标,那么它将成为默认的构建目标。

总的来说,EXCLUDE_FROM_ALL 是一个方便的选项,可用于控制哪些目标被默认构建,而 make all 是一个常用的命令,用于构建整个项目。


Q:静态库的扩展名就是.a,动态库的扩展名就是.so吗

A:

通常情况下在 Linux 系统上,静态库的扩展名是 .a,动态库的扩展名是 .so。但是有些情况下,也可能会有一些其他的扩展名。例如,在 macOS 上,动态库的扩展名是 .dylib。在 Windows 上,静态库的扩展名是 .lib,动态库的扩展名是 .dll


关于make all

在CMake中,可以通过 add_executableadd_library 指令添加可执行文件和库。如果没有显式地指定要构建哪个目标,那么在执行 make 命令时,CMake 会自动构建一个名为 "all" 的默认目标。如果在 CMakeLists.txt 文件中指定了多个可执行文件或库,这些目标也会被包含在 "all" 目标中一起构建。可以使用 make all 命令来构建所有目标。

在 CMake 中,all 是一个默认的构建目标名称,如果你没有显式地指定构建目标,make 命令将默认构建名为 all 的目标。这个 all 目标将会包含在 CMakeLists.txt 中声明的所有可执行文件和库文件的构建目标。因此,当你执行 make 命令时,CMake 会构建所有在 CMakeLists.txt 文件中声明的可执行文件和库文件,除非你在命令行上指定了特定的构建目标。

在 CMakeLists.txt 中,如果你没有显式地指定构建目标,默认情况下 CMake 会自动生成一个名为 all 的构建目标。这个 all 目标包括了所有的可执行程序、静态库和动态库等构建目标。

而在使用 make 命令时,如果你没有指定目标,默认情况下 make 命令会执行 Makefile 文件中的第一个目标。由于在 CMake 生成的 Makefile 文件中,第一个目标就是 all,因此执行 make 命令时实际上是在构建 all 目标。因此,执行 make 命令和执行 make all 命令是等价的。

在 Makefile 中,all 是一个默认的目标名称,表示构建所有指定的目标。当在命令行中输入 make 命令时,如果没有指定目标名称,则默认构建名为 all 的目标,即构建 Makefile 中所有指定的目标(包括可执行文件、静态库、动态库等)。

可以在 Makefile 中显式指定 all 目标,也可以只指定部分目标,或者根本不指定目标名称,这取决于需求和 Makefile 的设计。


STATIC、SHARED和MODULE

在 CMake 中,add_library() 指令用于创建静态库、动态库或模块库。

  • STATIC:创建静态库,库文件的扩展名为 .a。
  • SHARED:创建动态库,库文件的扩展名为 .so(在 Windows 平台上是 .dll)。
  • MODULE:创建可加载模块(不同于上面两个库类型),在 Mac OS X 平台上,库文件的扩展名为 .so,在其它平台上,文件扩展名与 SHARED 相同。可加载模块与 SHARED 库的区别在于,可加载模块是在运行时被加载的,而 SHARED 库则在程序启动时就被加载了。

target_link_libraries

target_link_libraries 是 CMake 中用于将库文件链接到目标文件的命令。它的基本语法是:

target_link_libraries(target library1 library2 ...)

其中 target 是要链接库文件的目标,可以是可执行文件或者库文件;library1library2 等参数是要链接的库文件名。

举个例子,如果我们要将 hello 库链接到可执行文件 useHello 上,可以这样写:

add_executable(useHello useHello.cpp)
target_link_libraries(useHello hello)

这里 useHello 是要链接 hello 库的目标,hello 是要链接的库文件名。


cmake .

cmake . 是一条命令,用于在当前目录下执行 CMake 的构建流程。它会查找当前目录下的 CMakeLists.txt 文件,并根据这个文件中的指令生成对应的构建系统的文件(比如 Makefile 或 Visual Studio 的工程文件等)。这个命令通常在源代码目录下的 build 目录中执行,以保持源代码和构建文件的分离。


make

make是一个基于规则的构建工具,它读取一个名为Makefile的文件,根据其中定义的规则生成目标文件或可执行文件。

在使用make时,需要在命令行中指定要构建的目标名称。如果没有指定目标名称,则默认使用Makefile文件中定义的第一个目标。例如,如果在Makefile文件中定义了多个目标,比如allclean等,可以在命令行中使用以下命令:

  • make:构建默认目标,通常是all
  • make all:构建all目标
  • make clean:执行清理操作,删除生成的目标文件和可执行文件等

make会根据Makefile中定义的规则,判断哪些文件需要重新编译,哪些文件可以使用已有的编译结果,以此实现增量编译,提高构建效率。


scanning dependencies of target helloslam

"scanning dependencies of target" 是 CMake 在执行 make 时显示的一条消息,它表示 CMake 正在分析可执行文件 helloslam 的依赖关系,以确保在编译时按照正确的顺序编译它所依赖的其他目标(例如库文件)。

在 CMakeLists.txt 文件中,通过使用 target_link_libraries() 命令将目标文件与库文件关联,以指示 CMake 在编译可执行文件时应该包含哪些库文件。当执行 make 时,CMake 将根据这些依赖关系来编译所需的目标,确保所有必需的库文件在需要时都已经被正确地构建和链接。


building cxx object cmakefiles/helloslam.dir/helloslam.cpp.o

这条消息是 make 命令执行时的输出之一。它表示正在构建一个 C++ 代码文件 helloslam.cpp 的对象文件(.o 文件)。这个对象文件将被链接到最终的可执行文件中。在这个过程中,make 工具会自动处理 helloslam.cpp 的依赖项,并编译它所依赖的头文件和库文件。

cmakefiles/helloslam.dir/helloslam.cpp.o 是一个对象文件,由 helloslam.cpp 源文件编译而来,它是编译器生成的中间文件,用于在链接阶段合并成最终的可执行文件或库文件。CMake 生成 Makefile 后,Makefile 文件会将编译指令传递给编译器来生成目标文件,这里的 .o 表示是一个目标文件。

这些中间文件最终会被用来生成最终的目标文件或可执行文件,而生成的最终目标文件或可执行文件会被保留。而中间文件一般不需要保留,因为它们只是用来作为编译过程中的中间产物,最终目标文件或可执行文件包含了中间文件的所有必要信息。因此,在编译过程结束后,中间文件可以被删除或清理。

cmakefiles/helloslam.dir/helloslam.cpp.o 是一个文件,它是编译生成的中间文件。其中,cmakefiles 是 CMake 自动生成的目录,helloslam.dirhelloslam.cpp 所在的目录,在这个目录下生成的目标文件会存放在该目录下。helloslam.cpp.o 则是 helloslam.cpp 的编译生成的目标文件,.o 表示该目标文件是一个目标文件(Object File),即可执行文件的中间文件,也就是编译器生成的汇编代码转化而来的二进制文件。


linking cxx executable helloslam

这句话表示正在将 C++ 可执行文件 helloslam 进行链接。在 CMake 构建过程中,链接是指将目标文件和依赖库文件(静态库或动态库)合并成可执行文件的过程。当 CMake 完成了目标文件和库文件的编译后,会调用链接器将它们组合起来生成最终的可执行文件。这句话表示 CMake 已经完成了编译过程,正在将目标文件和依赖库文件链接成 helloslam 可执行文件。


built target helloslam

这句话是指 helloslam 目标已经成功构建完成了。其中包括对 helloslam.cpp 文件的编译和对依赖项(如果有的话)的链接操作,最终生成可执行文件 helloslam

视觉SLAM十四讲读书笔记(3)P27-P31相关推荐

  1. 视觉SLAM十四讲读书笔记(2)P10-P27

    目录​​​​​​​ Q:一个视觉SLAM框架由哪几个模块组成,各模块的任务又是什么 Q:什么是机器人的自主运动能力 Q:什么是机器人的感知 Q:什么是激光雷达 Q:什么是增强现实 Q:什么是IMU单元 ...

  2. 视觉SLAM十四讲读书笔记(5)P40-P52

    目录 Q:什么是eigen Q:正交矩阵的定义和性质 Q:什么是特殊正交群 Q:什么叫齐次坐标 Q:什么是特殊欧氏群 Q:什么是运算符重载 Q:什么是g2o Q:什么是sophus Q:什么是eige ...

  3. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践

     专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...

  4. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵

    专栏系列文章如下:  专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...

  5. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  6. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机

    第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...

  7. 视觉SLAM十四讲学习笔记---前三讲学习笔记总结之SLAM的作用、变换和位姿表示

    经过半年学习SLAM相关知识,对SLAM系统有了一些新的认识,故回看以前的学习记录,做总结和校正. 前三讲学习笔记如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉S ...

  8. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  9. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

最新文章

  1. 自然语言(NLP)发展史及相关体系
  2. TAB(Nav)导航菜单
  3. OpenCV Shi-Tomasi corner 检测器
  4. 如何查找UI5应用对应在ABAP Netweaver服务器上的BSP应用名称
  5. 自己整理的css3动画库,附下载链接
  6. linux课堂笔记(4)
  7. TensorFlow2.0:索引和切片(1)
  8. 技术人的折腾(二)-缺少的东西,你迟早要补起来
  9. 第五十三天 how can I 坚持
  10. 代写python作业 费用_代写dither method作业、代做python程序设计作业、代写python语言作业、代做Image Dithering作...
  11. Day01_硬盘基本知识
  12. 计算机硬件系统测试,介绍几个常用的电脑硬件检测工具
  13. MATLAB频谱图绘制
  14. python的opencv操作记录(七)——短时傅里叶变换(stft)
  15. 当年校招时,我就死在这个问题上...
  16. golang使用josn.Unmarshal报错:unexpected end of JSON input
  17. Fintech将重构信贷行业的信用管理现状!
  18. Spring boot——Actuator 详解
  19. SpringBoot获取微信openid(java)
  20. CANoe.DiVa操作指南-运行环境搭建

热门文章

  1. CSS盒子模型总结(小练习网易新闻列表和京东导航条)
  2. 深入立即Linux网络技术内幕学习笔记第十六章:桥接:Linux实现
  3. 小白学react之网页获取微信用户信息
  4. Qt里头文件包含的类的声明
  5. SnackBar的使用
  6. 11 数学库函数及其使用
  7. 新版全国计算机等级考试一级合格证书模板
  8. Qt实现钢笔、毛笔的笔锋效果
  9. 咳嗽除了呼吸系统疾病外,还可能是心脏病症状
  10. 【计算机毕业设计】278鲜牛奶订购系统