简单工程CmakeLists.txt的书写

本文介绍了如何在CMakeLists.txt文件中配置OpenGL、GLUT库,并集成OpenCV,包括引入相关插件、查找依赖库、设置包括路径和链接库等关键步骤。
工程文件夹下的CMakeLists.txt书写cmake_minimum_required(VERSION 2.8)

cmake_minimum_required(VERSION 2.8)

project(earth)//工程名字随便取
include($ENV{HOME}/usr/share/cmake/Modules/geo_sim_sdk.cmake)//装的一个关于Cmake的插件
include_geo_sim_sdk()
link_geo_sim_sdk()

add_subdirectory(src)//指定子文件名


然后工程文件夹的src文件下的CMakeLists.txt的书写如下

cmake_minimum_required(VERSION 2.8)

find_package(OpenGL)//这是找OpenGL库
if(OPENGL_FOUND)
  include_directories(${OPENGL_INCLUDE_DIR})
endif()

find_package(GLUT)//这是找GLUT库
if(GLUT_FOUND)
  include_directories(${GLUT_INCLUDE_DIR})
endif()

include_directories($ENV{OpenCV_DIR})//这是下载安装的OpenCV的目录名,在bashrc里面定义的环境变量
message("just test")
message("$ENV{OpenCV_DIR}")
include_directories(../include)

add_executable_from_dir(Candle_OBJ_Loader ./)
link_directories(/usr/local/lib)
target_link_libraries(Candle_OBJ_Loader

  //下面都是各个库的名称
  ${OPENGL_LIBRARIES}
  ${GLUT_glut_LIBRARY}

  //下面两个是动态库,运行的时候还要修改临时LD_LIBRARY_PATH变量
  opencv_core
  opencv_highgui
)

<think> 我们正在讨论C++中的模块化代码书写方法。根据引用[5],模块化代码是指将程序分解为独立的、可重用的部分(模块),每个模块负责单一功能。在C++中,模块化可以通过函数、类、命名空间以及文件组织来实现。下面我将详细解释如何在C++中实现模块化编程。 ### 1. **使用函数封装独立功能** 函数是最基本的模块化单元。每个函数应只完成一个明确的任务,并尽量不依赖外部状态(即避免使用全局变量)。通过参数传递数据,通过返回值输出结果。 **示例**(参考引用[5]): ```cpp // 函数:在字符串中查找特定字符并返回位置 int findChar(const std::string& str, char target) { for (int i = 0; i < str.size(); ++i) { if (str[i] == target) { return i; } } return -1; // 未找到 } void processString() { std::string text = "hello"; int pos = findChar(text, 'e'); // 使用pos... } ``` **优势**: - 避免重复代码。 - 提高可测试性(每个函数可单独测试)。 ### 2. **使用类封装数据与行为** 当一组数据和操作这些数据的函数密切相关时,应封装为类(参考引用[1]和引用[4])。类通过访问修饰符(`public`、`private`)控制内部状态的暴露程度。 **示例**(参考引用[4]): 头文件 `user_info.hpp`: ```cpp #pragma once #include <string> // 类:封装用户信息 class UserInfo { public: UserInfo() : age(0), sex(0) {} void setName(const std::string& name) { username = name; } std::string getName() const { return username; } private: std::string username; int age; int sex; }; ``` **最佳实践**: - 成员变量设为 `private`,通过公共接口(getter/setter)访问。 - 头文件使用 `#pragma once` 防止重复包含[^4]。 ### 3. **使用命名空间组织模块** 命名空间(Namespace)用于避免命名冲突,将相关功能分组(参考引用[2])。尤其适用于大型项目。 **示例**(参考引用[2]): ```cpp namespace DataProcessing { namespace Algorithms { // C++17支持嵌套命名空间简化语法 double computeAverage(const std::vector<int>& data) { double sum = 0; for (auto num : data) sum += num; return sum / data.size(); } } } // 使用 auto avg = DataProcessing::Algorithms::computeAverage(data); ``` ### 4. **文件组织:头文件与源文件分离** - **头文件(.h/.hpp)**:声明函数、类、模板等接口(参考引用[4])。 - **源文件(.cpp)**:实现具体逻辑。 **规则**: - 简单数据结构(如POD类型)可直接在 `.hpp` 中定义(引用[4]示例)。 - 复杂逻辑(如类成员函数、模板特化)在 `.cpp` 中实现以缩短编译时间[^4]。 ### 5. **避免全局变量** 全局变量破坏模块独立性(引用[5])。应通过参数传递或局部变量共享数据。 ### 6. **使用现代C++特性提升模块化** - **Lambda表达式**:封装局部功能(引用[2]示例)。 - **智能指针**:避免手动内存管理,确保资源安全(如 `std::unique_ptr`)。 - **模板**:编写通用模块(如容器算法)。 **示例**(模板函数): ```cpp namespace MathUtils { template <typename T> T max(T a, T b) { return a > b ? a : b; } } ``` ### 完整示例:模块化程序结构 ``` 项目目录结构: ├── include/ │ ├── math_utils.hpp # 声明数学工具函数 │ └── user_info.hpp # 声明UserInfo类 ├── src/ │ ├── math_utils.cpp # 实现数学工具 │ └── main.cpp # 主程序 ``` **math_utils.hpp**: ```cpp #pragma once namespace MathUtils { int add(int a, int b); } ``` **math_utils.cpp**: ```cpp #include "math_utils.hpp" namespace MathUtils { int add(int a, int b) { return a + b; } } ``` **main.cpp**: ```cpp #include "math_utils.hpp" #include <iostream> int main() { std::cout << MathUtils::add(2, 3); // 输出5 return 0; } ``` ### 总结:模块化编程的核心原则 1. **单一职责**:每个模块(函数/类)只做一件事。 2. **低耦合**:模块间依赖最小化(通过参数传递而非全局状态)。 3. **高内聚**:模块内部元素紧密相关。 4. **接口清晰**:头文件明确声明功能,隐藏实现细节[^1][^4]。 通过以上方法,C++代码可维护性、可读性和复用性将显著提升。 §§相关问题§§ 1. 如何在C++中设计低耦合的模块接口? 2. 使用命名空间组织模块时有哪些注意事项? 3. C++20的模块(Modules)特性如何改进模块化编程? </think> ### C++模块化代码书写方法 模块化编程是将程序分解为独立、可复用组件的设计方法,在C++中主要通过以下方式实现: #### 1. **函数级模块化**(基础单元) ```cpp // 数学工具模块 namespace MathUtils { // 计算阶乘 int factorial(int n) { return (n <= 1) ? 1 : n * factorial(n - 1); } // 判断素数 bool isPrime(int num) { if (num <= 1) return false; for (int i = 2; i*i <= num; ++i) { if (num % i == 0) return false; } return true; } } ``` **特点**: - 单一职责原则:每个函数只完成一个任务[^5] - 无状态设计:不依赖外部变量,通过参数传递数据 - 命名空间封装:防止命名冲突[^2] #### 2. **类级模块化**(面向对象封装) ```cpp // 用户信息模块 (UserInfo.hpp) #pragma once #include <string> class UserInfo { public: UserInfo(std::string name, int age) : name_(std::move(name)), age_(age) {} // 访问器 std::string getName() const { return name_; } int getAge() const { return age_; } // 业务逻辑 bool isAdult() const { return age_ >= 18; } private: std::string name_; int age_; }; ``` **最佳实践**: - 头文件声明,源文件实现(分离.cpp和.hpp)[^4] - 数据隐藏:成员变量设为`private`[^1] - 明确的接口:提供公共访问方法 #### 3. **文件级模块化**(工程组织) ``` project/ ├── include/ │ ├── MathUtils.hpp # 数学工具 │ └── UserInfo.hpp # 用户模块 ├── src/ │ ├── MathUtils.cpp │ ├── UserInfo.cpp │ └── main.cpp └── CMakeLists.txt ``` **文件规范**: 1. 简单模块使用.hpp单文件(如配置结构体)[^4] 2. 复杂模块采用.hpp声明 + .cpp实现 3. 头文件使用`#pragma once`防止重复包含 #### 4. **命名空间模块化** ```cpp namespace Network { class Socket { /*...*/ }; namespace Protocols { class HTTP { /*...*/ }; class FTP { /*...*/ }; } } // 使用 auto socket = Network::Socket(); auto http = Network::Protocols::HTTP(); ``` **优势**: - 逻辑分组相关功能[^2] - 避免全局命名污染 - 支持嵌套命名空间(C++17简化语法) #### 5. **模板模块化**(泛型编程) ```cpp template <typename T> class Vector { public: void push_back(const T& item); T& operator[](size_t index); // ... }; // 特化版本 template <> class Vector<bool> { // 位压缩实现... }; ``` **应用场景**: - 通用数据结构(如vector, list) - 算法抽象(如sort, find) #### 6. **现代C++20模块**(替代头文件) ```cpp // math_utils.ixx export module MathUtils; export { int add(int a, int b) { return a + b; } double circleArea(double r) { return 3.14 * r * r; } } // main.cpp import MathUtils; int main() { add(2, 3); // 直接使用 } ``` **优势**: - 编译加速(避免重复解析头文件) - 更严格的封装 - 显示接口导出(export关键字) ### 模块化设计原则 1. **高内聚低耦合**:模块内部紧密相关,模块间依赖最小化[^5] 2. **单一职责**:每个模块只解决一个问题 3. **明确接口**:提供简洁的访问方式,隐藏实现细节 4. **分层架构**: ```mermaid graph TD A[应用层] --> B[业务逻辑] B --> C[核心模块] C --> D[基础库] ``` ### 错误示例 vs 正确示例 ```cpp // ❌ 非模块化:全局变量耦合 std::string globalName; void printName() { std::cout << globalName; } // ✅ 模块化:通过参数传递 namespace Printer { void printName(const std::string& name) { std::cout << name; } } ``` ### 总结 | 模块化级别 | 适用场景 | 关键技术 | |------------|----------|----------| | 函数级 | 算法工具 | 命名空间, constexpr | | 类级 | 数据实体 | 封装, RAII, 继承 | | 文件级 | 工程管理 | .hpp/.cpp分离 | | 组件级 | 系统架构 | 动态库, CMake | 通过合理运用这些技术,可创建出易维护、可复用、低耦合的C++代码库[^1][^4][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值