CMAKE实践读书笔记(4)P26-P30

目录

make VERBOSE=1

什么是GLib

INCLUDE_DIRECTORIES

target_include_directories

target_include_directories和INCLUDE_DIRECTORIES有什么区别

编译器选项

CMAKE_INCLUDE_DIRECTORIES_BEFORE

 

ldd命令

(0xb7ee7000)(0xb7ece000)(0xb7d77000)(0xb7ee8000)什么意思

CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH

--extra-include-dir

FIND_PATH


/backup/cmake/t4/src/main.c:1:19: error: hello.h: 没有那个文件或目录

在错误信息中,1:19 表示错误出现在文件 /backup/cmake/t4/src/main.c 的第 1 行第 19 个字符处。这个信息通常有助于开发人员快速定位错误的位置,方便进行代码的修复。


make VERBOSE=1

make VERBOSE=1 是用于打印详细的构建信息的命令。它会在执行 make 命令时,将更多的构建信息输出到终端上,包括编译器命令、编译选项、链接器命令等等。这样做的好处是可以更方便地调试和排查编译错误,同时也可以更深入地了解整个项目的构建流程。


什么是GLib

GLib是一种跨平台的通用型C语言库,提供了许多常见数据结构、并发任务、网络编程、IO等操作的封装,使得开发者能够在不同的操作系统和硬件平台上快速开发出稳健的、高效的应用程序。GLib最初是由GNOME桌面环境项目开发的一种库,但现在已经成为了Linux和UNIX平台下许多其他应用程序的基础库。

GLib包含了一些标准的数据结构,例如链表、哈希表、树等,以及一些支持并发和异步编程的工具。此外,GLib还提供了各种支持Unicode和国际化的函数,例如字符串处理、文本编码转换和本地化等功能。

GLib的API文档和代码示例非常详细,使得开发者可以很容易地掌握使用它的方法。同时,由于GLib是跨平台的,所以在不同平台上的应用程序使用GLib的代码可以几乎无需修改。


INCLUDE_DIRECTORIES

INCLUDE_DIRECTORIES是CMake的一个命令,用于向项目添加头文件搜索路径。其语法格式如下:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

其中,AFTERBEFORE表示添加路径的位置,AFTER表示将路径添加到已有路径的后面,BEFORE表示将路径添加到已有路径的前面;SYSTEM表示包含的路径为系统级路径,dir1 dir2 ...表示具体要添加的路径。

例如,以下代码将系统头文件路径/usr/include添加到搜索路径中:

INCLUDE_DIRECTORIES(SYSTEM /usr/include)

注意,INCLUDE_DIRECTORIES命令并不会将路径添加到编译器选项中,只会影响到CMake生成的项目文件。如果需要将路径添加到编译器选项中,可以使用target_include_directories命令。


target_include_directories

target_include_directories 是 CMake 中用于为指定的目标(例如库或可执行文件)设置头文件搜索路径的命令。

它的语法如下:

target_include_directories(target
  [SYSTEM] [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

其中,target 表示目标名称;SYSTEM 表示将目录添加到系统头文件搜索路径中;BEFORE 表示将目录添加到普通搜索路径的前面;INTERFACE 表示只添加到接口的头文件搜索路径中,不会被目标本身使用;PUBLIC 表示添加到目标和目标链接的其他目标的头文件搜索路径中;PRIVATE 表示只添加到目标本身的头文件搜索路径中。

items 表示头文件搜索路径的目录列表。

举个例子,假设有一个目标名为 my_target,要添加一个头文件搜索路径 /usr/include/foo,则可以这样写:

target_include_directories(my_target PUBLIC /usr/include/foo)

这样就可以让 my_target 和链接到它的其他目标使用 /usr/include/foo 目录下的头文件了。


target_include_directories和INCLUDE_DIRECTORIES有什么区别

INCLUDE_DIRECTORIES 是一个全局命令,用于向 CMake 项目添加头文件目录,作用范围是全局的。

target_include_directories 是一个命令,它指定了一个目标库或可执行文件的头文件搜索路径。它指定的头文件搜索路径仅适用于特定的目标库或可执行文件,作用范围更加局限。

因此,使用 target_include_directories 更加灵活和推荐。它使得开发人员可以将特定目标库或可执行文件的头文件搜索路径与项目中其他目标库或可执行文件的头文件搜索路径分离开来,从而提高了项目的可维护性和可移植性。


编译器选项

编译器选项是一组命令行参数,用于告诉编译器如何编译源代码文件。编译器选项可以控制编译器的行为,比如生成代码的类型、调试信息的产生方式、优化等级、警告级别、语言标准等。

编译器选项通常由开发者在命令行上手动指定,或者在Makefile、CMakeLists.txt等构建脚本中配置,用于告诉编译器如何处理源文件。

常见的编译器选项包括:

  • -c:生成目标文件而不进行链接。
  • -o:指定输出文件名。
  • -I:添加包含文件目录。
  • -D:定义宏。
  • -Wall:显示所有警告信息。
  • -O:指定代码优化级别。
  • -g:生成调试信息。
  • -std:指定使用的语言标准。

不同的编译器支持的选项可能略有不同,开发者需要查阅相关文档来了解具体情况。

在编译 C++ 程序时,需要使用 C++ 编译器将源代码编译成可执行文件或库文件。CMake 生成的项目文件会包含编译器选项,它会被传递给编译器,告诉编译器如何编译源代码。编译器选项包括预定义的宏、头文件路径、链接库等等。

INCLUDE_DIRECTORIES 命令将指定目录添加到 CMake 生成的项目文件中,但不会自动将其添加到编译器选项中。如果需要将指定目录添加到编译器选项中,需要手动在编译器选项中添加 -I<dir> 选项。

target_include_directories 命令和 INCLUDE_DIRECTORIES 命令类似,但它会自动将指定目录添加到编译器选项中。CMake 会根据目标的类型(可执行文件、静态库或动态库)以及目标所在的平台,自动生成正确的编译器选项,并将指定目录添加到编译器选项中。这样,开发者就不需要手动添加编译器选项了。


CMAKE_INCLUDE_DIRECTORIES_BEFORE

CMAKE_INCLUDE_DIRECTORIES_BEFORE是一个CMake变量,用于控制INCLUDE_DIRECTORIES命令的行为。当设置为ON时,使用INCLUDE_DIRECTORIES添加的目录将会优先于系统默认目录被搜索到,即它们将被添加到编译器的命令行选项的最前面。而当设置为OFF时,这些目录将会被添加到编译器的命令行选项的最后面,即在系统默认目录的后面被搜索到。默认情况下,该变量的值为ON。


关于头文件如何关联源文件的学习认知_头文件和源文件怎么联系起来_天妇罗QAQ的博客-CSDN博客

当你在"c.cpp"中#include "a.h"时,编译器会查找"a.h"文件,并将其内容插入到"c.cpp"文件中。这样,在编译"c.cpp"时,编译器就知道"a.h"中声明的函数的原型,并会生成对这些函数的调用。然后,链接器将目标文件"c.o"和"b.o"链接在一起,以生成可执行文件。在链接过程中,链接器会将"c.o"中对"a.h"中函数的调用与"b.o"中对这些函数的实现建立连接。这样,当你运行可执行文件时,就可以正确地调用这些函数了。 


LINK_DIRECTORIES是CMake中的一个命令,用于指定可执行文件或库文件链接时的库文件搜索路径。在链接可执行文件或库文件时,需要指定用到的库文件,而这些库文件可能在不同的路径下,为了让链接器能够找到这些库文件,可以使用LINK_DIRECTORIES命令指定库文件搜索路径。

使用方法如下:

LINK_DIRECTORIES(path1 path2 ...)

其中,path1path2等为库文件搜索路径。

需要注意的是,LINK_DIRECTORIES命令会将指定的库文件搜索路径添加到所有目标的链接器选项中,包括依赖该目标的其他目标。这可能会导致链接出错或不一致,因此推荐使用target_link_libraries命令指定链接库,以保证链接器能够正确链接库文件。


TARGET_LINK_LIBRARIES是CMake中一个用于链接库的命令,它可以将一个或多个库链接到目标可执行文件或库中。其语法如下:

TARGET_LINK_LIBRARIES(target library1 library2 ...)

其中,target是目标可执行文件或库的名称,library1library2等则是要链接的库的名称。

此外,还可以使用以下语法为链接指定库的路径:

TARGET_LINK_LIBRARIES(target
  debug|optimized <path-to-library>/library1.lib
  debug|optimized <path-to-library>/library2.lib
  ...)

其中,debug|optimized是可选的,表示链接的是调试版库还是发布版库,<path-to-library>是库文件所在的路径,library1.liblibrary2.lib等则是库的名称。


ldd命令

ldd命令可以用于查看一个可执行文件或者共享库所依赖的共享库列表。它会显示出依赖的库文件的绝对路径或者未找到某些库的错误信息。ldd命令通常在调试共享库的时候使用。使用方法如下:

ldd [可执行文件或共享库路径]

例如,要查看一个名为main的可执行文件所依赖的共享库列表,可以执行以下命令:

ldd main

该命令会输出main所依赖的所有共享库的绝对路径,以及它们的版本信息。如果main依赖的共享库没有找到,ldd命令会输出相应的错误信息。


ldd src/main
     linux-gate.so.1 => (0xb7ee7000)
     libhello.so.1 => /usr/lib/libhello.so.1 (0xb7ece000)
     libc.so.6 => /lib/libc.so.6 (0xb7d77000)
     /lib/ld-linux.so.2 (0xb7ee8000)

这是对 src/main 文件执行 ldd 命令的结果,它会显示该可执行文件依赖的共享库。在这个结果中,可以看到该文件依赖以下共享库:

  • linux-gate.so.1:Linux 内核提供的虚拟库。
  • libhello.so.1:一个名为 libhello.so.1 的共享库文件,它被存放在 /usr/lib 目录中。
  • libc.so.6:C 标准库。
  • /lib/ld-linux.so.2:动态链接器,用于在运行时动态加载共享库。

这些共享库文件的路径是通过系统的动态链接器搜索路径来查找的。


(0xb7ee7000)(0xb7ece000)(0xb7d77000)(0xb7ee8000)什么意思

这是 ldd 命令输出的四个地址,分别对应四个库文件或共享对象:

  • (0xb7ee7000) 对应的是 linux-gate.so.1,这是一个虚拟库文件,代表 Linux 内核提供的一些系统调用接口。
  • (0xb7ece000) 对应的是 libhello.so.1,这是程序依赖的动态链接库文件,程序在运行时会加载它。
  • (0xb7d77000) 对应的是 libc.so.6,这是 C 库,是所有 C 语言程序都会依赖的标准库。
  • (0xb7ee8000) 对应的是动态链接器 ld-linux.so.2,在程序启动时会被加载,负责动态链接库文件的加载和解析。

CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH

在 CMake 构建系统中,CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH 是用于设置搜索头文件和库文件的路径的变量。

CMAKE_INCLUDE_PATH 变量是用于设置搜索头文件的路径的变量。CMake 在构建项目时会搜索这些路径以找到所需的头文件。可以使用 set 命令来设置 CMAKE_INCLUDE_PATH 变量,例如:

set(CMAKE_INCLUDE_PATH "/usr/local/include")

CMAKE_LIBRARY_PATH 变量是用于设置搜索库文件的路径的变量。CMake 在构建项目时会搜索这些路径以找到所需的库文件。可以使用 set 命令来设置 CMAKE_LIBRARY_PATH 变量,例如:

set(CMAKE_LIBRARY_PATH "/usr/local/lib")

需要注意的是,CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH 变量是全局变量,会影响到整个 CMake 项目的构建过程。如果只想在特定目标中设置搜索路径,应该使用 target_include_directories 和 target_link_libraries 命令来设置。

这两个变量 CMAKE_INCLUDE_PATHCMAKE_LIBRARY_PATH 是 CMake 中的内置变量,可以在 CMakeLists.txt 文件中使用,用于指定额外的头文件和库文件的搜索路径。在 CMakeLists.txt 文件中可以使用以下方式来设置:

set(CMAKE_INCLUDE_PATH /path/to/my/includes)
set(CMAKE_LIBRARY_PATH /path/to/my/libraries)

也可以使用命令行选项 -DCMAKE_INCLUDE_PATH=/path/to/my/includes-DCMAKE_LIBRARY_PATH=/path/to/my/libraries 来设置这些变量的值。 


--extra-include-dir

--extra-include-dir是一种自定义选项,可以在命令行上使用它来指定包含其他头文件的目录。

例如,如果我们有一个需要引用/path/to/myheader.h头文件的源文件main.c,我们可以使用以下命令来将该目录添加到包含路径中:

gcc main.c --extra-include-dir=/path/to/

这将告诉编译器在/path/to/目录中查找头文件。这个自定义选项可以用于许多不同的编译器和构建系统。


FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES(${myHeader})
ENDIF(myHeader)

这段CMake代码的作用是查找名为hello.h的头文件路径,并将该路径添加到项目的头文件搜索路径中。具体来说,它使用FIND_PATH命令查找名为hello.h的头文件,如果找到则将其路径存储在变量myHeader中,然后使用INCLUDE_DIRECTORIES命令将该路径添加到项目的头文件搜索路径中。如果没有找到该头文件,则不会将任何路径添加到搜索路径中。

需要注意的是,使用INCLUDE_DIRECTORIES命令添加的路径只对当前目录及其子目录中的源文件有效。如果需要将路径添加到其他目录的源文件中,需要在该目录下使用相同的命令添加路径。另外,如果使用了FIND_PATH命令查找头文件路径,建议使用类似上述代码的方式将其添加到搜索路径中,而不是直接使用INCLUDE_DIRECTORIES命令指定路径。这样可以确保在不同的系统上都能正确地找到头文件路径。


FIND_PATH

FIND_PATH是一个CMake命令,用于在系统中查找给定名称的文件或目录的路径。该命令在给定的一组路径中查找指定的文件或目录,并将其路径存储在一个变量中,以供后续使用。

该命令的基本语法如下:

FIND_PATH(<variable> name1 [path1 path2 ...])

其中,<variable>是存储结果的变量名称,name1是要查找的文件或目录的名称,path1path2等是要搜索的路径。如果未指定路径,则默认为CMake搜索路径。

例如,下面的示例用于查找名为hello.h的头文件,并将其路径存储在名为myHeader的变量中:

FIND_PATH(myHeader hello.h)

如果找到了hello.h,则该变量将被设置为其路径。否则,该变量将被设置为myHeader-NOTFOUND。可以使用IF语句检查变量是否设置为myHeader-NOTFOUND,以确定是否找到了所需的文件或目录。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值