目录
2.1.1 C++ 工程的一般组织结构
一般情况下,C++工程的组织结构是将不同的功能封装在不同的类中,每个类用配套的头文件和源文件来实现,头文件可以是*.h
、*.hpp
之类的文件,源文件可以是*.cc
、*.cpp
之类的文件。最后在 main 函数中,调用类来实现具体的功能。
2.1.2 C++ 工程在机器人中的组织结构
在机器人项目中,C++ 工程代码通常分成两个部分:一个部分用于实现具体算法,另一个部分用于进行 ROS 接口封装。
ROS 接口负责数据输入、数据输出以及核心算法调用
2.2 C++ 代码的编译
3 种 编译工具: g++、make、CMake
foo.h
// 宏定义 防止头文件 重复包含与编译
#ifndef FOO_H_
#define FOO_H_
#include <string>
// 命名空间设置 防止出现 重复的函数与变量
namespace foo{
class MyPrint{
// 声明类 具体函数实现 在 foo.cpp 中
public:
MyPrint(std::string output); // 构造函数
void ExcutePrint();
std::string output_;
};
}
#endif
foo.cpp
#include "foo.h" // 首先在 当前目录 下搜索需要包含的文件
#include <iostream> // 首先在系统头文件目录中搜索需要包含的文件
#include <string>
//
// 如果是标准库函数的头文件,则使用<>包含头文件;如果是自定义的头文件,优先使用" "包含头文件。
namespace foo{
MyPrint::MyPrint(std::string output):output_(output){
std::cout << "class MyPrint create a object!";
std::cout << std::endl;
}
void MyPrint::ExcutePrint(){
std::cout << output_ << std::endl;
}
}
main.cpp
#include "foo.h"
int main(int argc, char** argv){
// 创建 类 MyPrint 的实例对象, 并传入 初始化参数
foo::MyPrint my_print("I can output string!");
my_print.ExcutePrint(); // 调用 对象中的成员函数
return 0;
}
2.2.1 g++ 编译
若未安装 g++:sudo apt install g++
已安装则跳过。
预处理、编译、汇编、连接。
g++ foo.cpp main.cpp -o demo
./demo
2.2.2 make 编译
makefile
start: # 命令块 命名 下面的命令后不能加注释。 是直接在 命令行界面 运行的指令
g++ -o foo.o -c foo.cpp
g++ -o main.o -c main.cpp
g++ -o demo foo.o main.o
clean: # 删除 中间文件
rm -rf foo.o main.o
✅ 2.2.3 CMake 编译
CMake可以自动处理程序之间的关系,并产生对应的 makefile 文件,然后调用 make 就可以编译了。
CMakeLists.txt
# 声明 CMake 的最低版本
cmake_minimum_required(VERSION 2.8)
# 声明 CMake 工程名
project(demo)
include_directories("${PROJECT_BINARY_DIR}")
# 创建库文件
add_library (foo foo.cpp)
# 创建 可执行文件
add_executable (demo main.cpp)
# 为 可执行文件 连接依赖库
target_link_libraries (demo foo)
在 源文件 所在目录 打开命令行窗口。
mkdir build
cd build
cmake ..
make
./demo
C++ 编程风格 可参考:https://github.com/google/styleguide?tab=readme-ov-file
标签:P2,main,范式,++,C++,编译,cpp,foo From: https://www.cnblogs.com/zhagen0001000/p/18196547