视觉SLAM十四讲读书笔记(3)P27-P31
目录
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:
- Ubuntu:基于Debian的Linux发行版,非常流行,适合新手使用。
- Fedora:基于Red Hat的Linux发行版,注重最新的开源软件,用于工作站、服务器和云计算。
- Debian:老牌Linux发行版,以稳定性著称,被广泛用于服务器和桌面系统。
- CentOS:基于Red Hat企业版Linux的开源克隆版,用于服务器。
- Arch Linux:面向Linux专业人员的轻量级Linux发行版,注重自由和灵活性。
- openSUSE:基于SUSE Linux Enterprise的Linux发行版,可用于桌面和服务器系统。
- Kali Linux:用于网络安全和渗透测试的Linux发行版。
- 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操作系统的,但两者之间也有不同之处。其中一些不同之处包括:
- 开发者:Unix是由贝尔实验室的开发人员开发的,而Linux则是由Linus Torvalds和全球各地的志愿者开发的。
- 版权:Unix是一个商业操作系统,必须购买许可证才能使用,而Linux是免费且开源的。
- 内核:Linux和Unix的内核略有不同,因此它们处理某些操作的方式也略有不同。
- 应用程序:Linux和Unix操作系统可以运行相同的应用程序,但它们在支持某些应用程序方面可能会有所不同。
- 用户界面: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
这个错误通常表示系统无法找到输入的命令或可执行文件。可能是因为没有正确安装相应的软件包或工具,或者输入的命令名称有误。
可以尝试以下解决方案:
检查输入的命令名称是否正确。确保没有拼写错误或语法错误。
检查是否正确安装了相应的软件包或工具。可以尝试重新安装软件包或使用包管理器安装相应的工具。
检查的环境变量是否正确配置。确保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 文件,具体解释如下:
cmake_minimum_required(VERSION 2.8)
:声明需要的 CMake 最低版本为 2.8,如果版本低于此,将不能使用本文件。project(HelloSLAM)
:声明这是一个 CMake 工程,命名为 HelloSLAM。set(CMAKE_BUILD_TYPE "Debug")
:设置编译模式为 Debug,这将会告诉编译器在编译过程中生成调试信息,便于调试程序。add_executable(helloSLAM helloSLAM.cpp)
:添加一个可执行程序,名字为 helloSLAM,源代码文件为 helloSLAM.cpp。add_library(hello libHelloSLAM.cpp)
:添加一个静态库,名字为 hello,源代码文件为 libHelloSLAM.cpp。add_library(hello_shared SHARED libHelloSLAM.cpp)
:添加一个共享库,名字为 hello_shared,源代码文件为 libHelloSLAM.cpp。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_executable
和add_library
指令用于声明要生成的可执行文件或库文件的名称和源代码文件,而target_link_libraries
用于将库文件链接到可执行文件上。在该示例中,生成了三个可执行文件(helloSLAM
、useHello
)和两个库文件(hello
、hello_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>
:可选参数,用于指定变量的类型。常用的类型有BOOL
、STRING
、PATH
等。<docstring>
:可选参数,用于为变量提供说明文档。FORCE
:可选参数,如果在命令行或缓存中已经设置了该变量,则使用该参数强制更新变量的值。
例如,set(CMAKE_BUILD_TYPE "Debug")
用于将变量CMAKE_BUILD_TYPE
的值设置为Debug
,这将启用调试信息和关闭优化。
Q:在cmake中,PATH是什么
A:在CMake中,PATH
是一种变量类型,用于表示文件路径。和STRING
和BOOL
不同,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中,PATH
和FILEPATH
都是变量类型。它们的区别在于:
PATH
变量类型表示一个路径,可以是绝对路径或相对路径。FILEPATH
变量类型表示一个文件路径,必须是一个绝对路径。
在使用set
指令时,可以将变量类型指定为PATH
或FILEPATH
,如下所示:
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
是可执行文件的名称,可以是任何合法的文件名。WIN32
和MACOSX_BUNDLE
是可选项,表示生成的可执行文件是Windows或MacOSX专用的。EXCLUDE_FROM_ALL
是另一个可选项,表示生成的可执行文件不会被默认构建,需要手动指定。source1
、source2
等参数是要编译的源文件列表。
例如,下面的代码将名为myprogram
的可执行文件编译出来:
add_executable(myprogram main.cpp foo.cpp bar.cpp)
在执行cmake
和make
命令后,会生成一个名为myprogram
的可执行文件。
add_library指令
add_library
是CMake中的一个命令,用于将源文件编译为静态库或动态库。它的语法如下:
add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])
其中,<name>
表示库的名称,可以包含路径,如lib/mylib
。STATIC
、SHARED
和MODULE
分别表示静态库、共享库和模块。如果不指定,则默认为STATIC
。EXCLUDE_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.cpp
和world.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_executable
和 add_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
是要链接库文件的目标,可以是可执行文件或者库文件;library1
,library2
等参数是要链接的库文件名。
举个例子,如果我们要将 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
文件中定义了多个目标,比如all
、clean
等,可以在命令行中使用以下命令:
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.dir
是 helloslam.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相关推荐
- 视觉SLAM十四讲读书笔记(2)P10-P27
目录 Q:一个视觉SLAM框架由哪几个模块组成,各模块的任务又是什么 Q:什么是机器人的自主运动能力 Q:什么是机器人的感知 Q:什么是激光雷达 Q:什么是增强现实 Q:什么是IMU单元 ...
- 视觉SLAM十四讲读书笔记(5)P40-P52
目录 Q:什么是eigen Q:正交矩阵的定义和性质 Q:什么是特殊正交群 Q:什么叫齐次坐标 Q:什么是特殊欧氏群 Q:什么是运算符重载 Q:什么是g2o Q:什么是sophus Q:什么是eige ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践
专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵
专栏系列文章如下: 专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...
- 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理
第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...
- 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机
第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...
- 视觉SLAM十四讲学习笔记---前三讲学习笔记总结之SLAM的作用、变换和位姿表示
经过半年学习SLAM相关知识,对SLAM系统有了一些新的认识,故回看以前的学习记录,做总结和校正. 前三讲学习笔记如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉S ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
最新文章
- 自然语言(NLP)发展史及相关体系
- TAB(Nav)导航菜单
- OpenCV Shi-Tomasi corner 检测器
- 如何查找UI5应用对应在ABAP Netweaver服务器上的BSP应用名称
- 自己整理的css3动画库,附下载链接
- linux课堂笔记(4)
- TensorFlow2.0:索引和切片(1)
- 技术人的折腾(二)-缺少的东西,你迟早要补起来
- 第五十三天 how can I 坚持
- 代写python作业 费用_代写dither method作业、代做python程序设计作业、代写python语言作业、代做Image Dithering作...
- Day01_硬盘基本知识
- 计算机硬件系统测试,介绍几个常用的电脑硬件检测工具
- MATLAB频谱图绘制
- python的opencv操作记录(七)——短时傅里叶变换(stft)
- 当年校招时,我就死在这个问题上...
- golang使用josn.Unmarshal报错:unexpected end of JSON input
- Fintech将重构信贷行业的信用管理现状!
- Spring boot——Actuator 详解
- SpringBoot获取微信openid(java)
- CANoe.DiVa操作指南-运行环境搭建