操作系统OS:Linux-ubuntu20.04
开发环境IDE:vscode
第 1 步目标
[INFO] humanoid_joint_project start
第 2 步:先创建目录
在终端执行:
mkdir -p humanoid_joint_demo/{include/common,include/hal,include/protocol,include/drivers,include/control,include/sensors,include/simulation}mkdir -p humanoid_joint_demo/{src/common,src/hal,src/protocol,src/drivers,src/control,src/sensors,src/simulation}mkdir -p humanoid_joint_demo/{config,docs,scripts,test,logs,build}cd humanoid_joint_demo
检查目录,执行:
find . -maxdepth 2 -type d | sort
第 3 步:写 CMakeLists.txt
在项目根目录创建文件:
文件:vim CMakeLists.txt
# 指定 CMake 最低版本要求cmake_minimum_required(VERSION 3.10)# 定义项目名称project(humanoid_joint_project)# 指定使用 C++17 标准set(CMAKE_CXX_STANDARD 17)# 要求必须支持 C++17set(CMAKE_CXX_STANDARD_REQUIRED ON)# 禁止编译器使用 GNU 扩展,保证代码更标准set(CMAKE_CXX_EXTENSIONS OFF)# 如果没有指定编译类型,则默认使用 Debug 模式if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug)endif()# 添加常用警告选项,帮助尽早发现代码问题add_compile_options(-Wall -Wextra)# 添加头文件搜索路径include_directories(include)# 递归收集 src 目录下的所有 cpp 源文件file(GLOB_RECURSE SRC_FILES src/*.cpp)# 生成可执行文件 humanoid_joint_projectadd_executable(${PROJECT_NAME} ${SRC_FILES})
project第 4 步:日志模块
文件:include/common/logger.h
#pragma once // 防止头文件被重复包含/* * 文件作用: * 本文件定义项目中的基础日志类 Logger。 * * 当前阶段目标: * 1. 支持 INFO / WARN / ERROR 三种日志级别 * 2. 支持多线程场景下的互斥输出 * 3. 输出格式统一为:[LEVEL] message */#include<iostream> #include<mutex> // 用于互斥锁,保证多线程日志不会互相打断#include<string> // 用于 std::stringnamespace hjp { // humanoid_joint_project 的命名空间classLogger {public:staticvoidinfo(conststd::string& msg);staticvoidwarn(conststd::string& msg);staticvoiderror(conststd::string& msg);private:/* * 成员作用: * 用于保证多个线程同时打印日志时,输出内容不会交叉混乱。 */staticstd::mutex mutex_;staticvoidlog(conststd::string& level, conststd::string& msg);};} // namespace hjp
文件:src/common/logger.cpp
/* * 文件作用: * 本文件实现 Logger 类的具体功能。 */#include"common/logger.h"// 引入对应头文件namespace hjp { // 进入项目命名空间// 定义静态互斥锁对象std::mutex Logger::mutex_;voidLogger::log(conststd::string& level, conststd::string& msg){// 加锁,确保多线程同时输出时不会串行混乱std::lock_guard<std::mutex> lock(mutex_);// 按统一格式输出日志std::cout << "[" << level << "] " << msg << std::endl;}voidLogger::info(conststd::string& msg){// 调用统一日志接口,等级设为 INFOlog("INFO", msg);}voidLogger::warn(conststd::string& msg){// 调用统一日志接口,等级设为 WARNlog("WARN", msg);}voidLogger::error(conststd::string& msg){// 调用统一日志接口,等级设为 ERRORlog("ERROR", msg);}} // namespace hjp
第 5 步:重写主程序
文件:src/main.cpp
#include"common/logger.h"// 引入日志模块头文件intmain(){// 输出程序启动日志 hjd::Logger::info("humanoid_joint_project start");// 返回 0,表示主程序正常结束return0;}
第 6 步:补一个 .gitignore
文件:.gitignore
# 忽略 build 目录中的编译产物/build/# 忽略目标文件*.o# 忽略静态库文件*.a# 忽略动态库文件*.so# 忽略编辑器临时文件*.swp# 忽略 macOS 系统生成的隐藏文件.DS_Store# 忽略日志目录中的日志文件logs/*.log
第 7 步:编译运行
在项目根目录执行:
cd buildcmake ..make -j./humanoid_joint_project
运行输出效果:
[INFO] humanoid_joint_project start
第 8 步:初始化 Git
在项目根目录执行:
git initgit add .git commit -m "init: bootstrap project and basic logger"
第 9 步:查看完整项目文件树