HarmonyOS7 HdsNavigation 滚动联动标题栏:让页面更像系统应用
2026/7/18 5:37:44
#1.CMake版本(固定)cmake_minimum_required(VERSION3.8)#2.功能包名(与package.xml一致)project(advanced_pkg)# 自动创建两个变量:(后续可直接使用) # ${PROJECT_NAME}(本CMakeLists.txt的project名称) # ${PROJECT_SOURCE_DIR}(本CMakeLists.txt所在的文件夹路径) #3.C++标准设置(必须放在所有构建命令之前)set(CMAKE_CXX_STANDARD17)# 使用C++17标准set(CMAKE_CXX_STANDARD_REQUIRED ON)# 强制要求,不允许降级set(CMAKE_CXX_EXTENSIONS OFF)# 禁用编译器特有的GNU扩展 #4.编译选项(可选)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES"Clang")add_compile_options(-Wall-Wextra-Wpedantic)endif()# 设置默认构建类型为 Release(如果未指定)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRING"Build type"FORCE)message(STATUS"Build type set to Release by default")endif()#5.寻找依赖(不变)find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(std_msgs REQUIRED)find_package(rosidl_default_generators REQUIRED)#用于生成自定义 msg/srv # 第三方库find_package(Eigen3 REQUIRED)find_package(OpenCV REQUIRED)find_package(Sophus REQUIRED)find_package(Boost REQUIRED COMPONENTS thread)#使用库的部分内容#find_package(xxx REQUIRED)会生成一些可以使用的变量:常用的包括:#<PackageName>_FOUND:最重要的变量,用于指示包是否被成功找到。如果找到,其值为 TRUE; #<PackageName>_INCLUDE_DIRS 或<PackageName>_INCLUDES:包的头文件包含路径。 #<PackageName>_LIBRARIES 或<PackageName>_LIBS:包需要链接的库文件。 #<PackageName>_DEFINITIONS:使用该包时可能需要添加的预处理器定义。 #6.生成自定义接口(msg/srv)rosidl_generate_interfaces(${PROJECT_NAME}"msg/RobotPose.msg"# 自定义消息"srv/AddTwoInts.srv"# 自定义服务 DEPENDENCIES std_msgs # 如果消息中引用了 std_msgs 类型,需列出)#include_directories(include)老版本会加一些第三方库的头文件,但是尽量舍弃,详细分析见下面的链接:#[https://blog.csdn.net/aiccc/article/details/162931080?spm=1001.2014.3001.5501]target_include_directories(pose_publisher PRIVATE ${EIGEN3_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}${Sophus_INCLUDE_DIRS}# 假设 Sophus 设置了该变量(实际可能不同))#7.# 新增:生成自定义库(动态库,供其他节点复用) # 格式:add_library(库名 SHARED 库的实现文件)add_library(tool_utils_lib SHARED src/tool_utils.cpp)# 链接库的依赖(如果库用到了ROS2的工具,需添加)ament_target_dependencies(tool_utils_lib rclcpp std_msgs)target_link_libraries(tool_utils_lib ${Boost_LIBRARIES})# 编译多个节点add_executable(pose_publisher src/pose_publisher.cpp)add_executable(add_server src/add_server.cpp)add_executable(add_client src/add_client.cpp)add_executable(node1 src/node1.cpp)add_executable(node2 src/node2.cpp)#8.链接依赖 # 链接自定义接口rosidl_target_interfaces(pose_publisher ${PROJECT_NAME}"rosidl_typesupport_cpp")rosidl_target_interfaces(add_server ${PROJECT_NAME}"rosidl_typesupport_cpp")rosidl_target_interfaces(add_client ${PROJECT_NAME}"rosidl_typesupport_cpp")# 链接基础依赖和自定义库 # 最好用target_link_libraries替代ament_target_dependenciesament_target_dependencies(pose_publisher rclcpp std_msgs)ament_target_dependencies(add_server rclcpp std_msgs)ament_target_dependencies(add_client rclcpp std_msgs)ament_target_dependencies(node1 rclcpp std_msgs)ament_target_dependencies(node2 rclcpp std_msgs)# 自定义库target_link_libraries(node1 tool_utils_lib)target_link_libraries(node2 tool_utils_lib)# 第三方库target_link_libraries(pose_publisher ${OpenCV_LIBRARIES})#9.安装规则 # 安装节点install(TARGETS pose_publisher add_server add_client node1 node2 tool_utils_lib DESTINATION lib/${PROJECT_NAME})# 安装接口、头文件、launch、configinstall(DIRECTORY msg srv DESTINATION share/${PROJECT_NAME}/)install(DIRECTORY include/DESTINATION include)install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}/)#10.测试if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()endif()#11.固定结尾ament_package()