编译和链接的区别
特性 | 编译(Compilation) | 链接(Linking) |
---|---|---|
输入 | 源代码文件(如 .c , .cpp )和头文件(如 .h ) |
目标文件(如 .o )和库文件(如 .so , .a ) |
输出 | 目标文件(如 .o ) |
可执行文件(如 main )或库文件(如 .so ) |
目的 | 将源代码转换为目标代码 | 将目标文件和库文件组合成最终可执行文件 |
工具 | 编译器(如 gcc , g++ ) |
链接器(通常由编译器调用,如 ld ) |
build.make
是一个由构建工具(如 CMake)自动生成的 Makefile 文件,用于定义项目的编译和链接规则。- 编译 是将源代码转换为目标代码的过程。
- 链接 是将目标文件和库文件组合成最终可执行文件的过程。
- 编译和链接是软件开发中不可或缺的两个步骤,共同完成了从源代码到可执行程序的转换过程。
nm命令主要用于显示二进制文件中的符号信息,包括函数和变量的地址和类型。
ldd
命令的作用是显示一个可执行文件或共享库所依赖的共享库(动态链接库)的完整路径。它可以帮助我们了解程序运行时依赖的库文件,以及这些库文件的位置。
-
CMake与ament_cmake的区别:
- CMake:是一个通用的、跨平台的构建工具,用于生成项目的编译文件(如Makefile)。它需要手动配置项目结构、编译选项等。
- ament_cmake:是ROS2(Robot Operating System 2)中一个专门用于简化CMake配置的包。它提供了一系列CMake宏和函数,帮助开发者更方便地构建ROS2包,减少了手动配置的复杂性。
-
find_package命令的作用:
find_package
是CMake中的一个命令,用于查找并加载指定的软件包。REQUIRED
参数表示如果找不到指定的包,CMake将报错并终止构建过程。
-
具体包的功能:
- ament_cmake:提供ROS2特定的CMake配置,简化构建流程。
- rclcpp:ROS2的C客户库,允许使用C语言编写ROS2节点。
- std_msgs:包含ROS2的标准消息类型,用于节点之间的通信。
-
代码解释:
find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED)
复制
- 这三行代码在CMakeLists.txt中告诉CMake查找并加载ament_cmake、rclcpp和std_msgs包。
- 如果这些包中的任何一个未找到,构建过程将停止,并提示错误信息。
通过使用ament_cmake
,开发者可以更方便地配置ROS2项目的构建,而不需要手动处理复杂的CMake配置。同时,加载rclcpp
和std_msgs
包为项目提供了必要的ROS2功能和消息类型,确保节点能够有效地构建和通信。
-
指定CMake最低版本要求:
cmake_minimum_required(VERSION 3.8)
复制
- 这行代码告诉CMake,构建此项目需要至少CMake版本3.8。如果用户的CMake版本低于3.8,CMake会报错并提示需要升级。
-
定义项目名称:
project(communication_monitor_fast)
复制
- 这行代码定义了项目的名称为
communication_monitor_fast
。这个名称会在生成的构建系统中使用,例如在IDE中显示的项目名称或生成的构建文件夹中。
- 这行代码定义了项目的名称为
-
条件判断编译器类型并添加编译选项:
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif()
复制
-
条件判断:
CMAKE_COMPILER_IS_GNUCXX
:检查当前使用的C编译器是否是GNU的g。CMAKE_CXX_COMPILER_ID MATCHES "Clang"
:检查当前C++编译器的ID是否包含"Clang",即判断是否使用Clang编译器。- 如果上述任一条件成立,则执行
add_compile_options
命令。
-
添加编译选项:
-Wall
:启用大多数的警告选项,帮助发现代码中的问题。-Wextra
:启用额外的警告选项,提供更严格的代码检查。-Wpedantic
:使编译器严格遵守ISO C++标准,指出不符合标准的代码。
-
作用:当使用g或Clang编译器时,启用这些警告选项,以帮助开发者编写更规范、更健壮的代码。如果使用其他编译器(如Microsoft Visual C),这些选项不会被添加,可能需要在不同的编译器上进行不同的配置。
-
通过以上步骤,这段CMake代码确保了项目在使用g++或Clang编译器时会启用额外的警告选项,同时指定了项目所需的CMake最低版本和项目名称。
总结:
-
第一步 :通过
file(GLOB MONITOR_SOURCE src/*.cpp)
,CMake 会自动收集src
目录下的所有.cpp
源文件,并将其路径存储在MONITOR_SOURCE
变量中。 -
第二步 :通过
add_library(${PROJECT_NAME} ${MONITOR_SOURCE} ${MONITOR_REPORT_SOURCE})
,CMake 创建了一个名为${PROJECT_NAME}
的库,并将${MONITOR_SOURCE}
和${MONITOR_REPORT_SOURCE}
中的源文件编译到这个库中。
通过这两行代码,项目的源文件被正确地收集和编译,形成了一个可以在其他部分引用的库。