【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。

官方安装教程

https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html

Windows下安装

windows下安装就按照教程好了。采用cmake-gui进行配置,建议首次安装只安装核心模块。然后依此configure下irrlicht,sensor模块(依赖其他内容),GPU模块等。

configure后,generate后,用visual studio编译全部模块,需要i5-12代CPU 16线程编译将近20分钟,还是比ubuntu下慢很多啊。

在这里插入图片描述
BUILD_SHARED_LIBS 需要On,因为后面编译自己的程序依赖这些 .a 文件。

Ubuntu下安装:

ubuntu下的安装主要是一个一个自己编译。

1、核心模块安装

核心模块需要:Eigen库,这个默认已经安装好了。

Step 1. 下载代码

由于GPU模块需要第三方库支持,所以使用git下载后更新子模块
Error when building GPU module

git clone https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html
cd chrono
git submodule init
git submodule upd
<think>好的,用户之前让我帮忙写了一个狼人杀的C++代码,现在他用Dev-C++运行时报错了。我需要分析可能的问题并提供解决方案。首先,我得考虑用户可能遇到的常见错误类型,比如编译错误、运行时错误或者环境配置问题。 用户提到的是“报错了”,但没具体说明错误信息,所以需要覆盖可能的几种情况。常见的错误可能包括: 1. **编译错误**:比如语法错误、缺少头文件、标准库版本问题。Dev-C++默认可能使用较旧的编译器,不支持C++11或更高标准,导致某些特性无法使用。 2. **运行时错误**:比如指针问题、数组越界、未初始化的变量。代码中使用了面向对象和虚函数,可能存在虚析构的问题,或者new/delete管理不当。 3. **环境配置问题**:Dev-C++的项目设置是否正确,比如是否正确添加了源文件,编译器路径是否正确。 4. **代码本身的缺陷**:比如内存泄漏、指针未初始化等,比如Player基类的析构函数是否为虚函数,可能导致析构时未正确释放派生类对象,引发未定义行为。 首先,我需要检查代码是否符合C++标准。例如,代码中使用了初始化列表的roles = { ... },这需要C++11支持。而旧版本的Dev-C++可能默认使用较老的C++标准,导致编译失败。解决方案是启用C++11或更高版本。 其次,检查虚析构函数。Player类的析构函数没有定义,当通过基类指针删除派生类对象时,会导致未定义行为。需要为Player类添加虚析构函数。 另外,代码中使用了random_shuffle,该函数在C++17中被弃用,C++20中移除。如果用户的Dev-C++版本较新,可能已经移除了这个函数,需要替换为shuffle,并提供随机数种子。 还有,检查内存管理是否正确。比如所有new出来的Player对象是否都被正确删除,避免内存泄漏。在代码末尾的清理部分,是否遍历players数组并删除每个指针。 可能的其他问题包括输入处理不当,比如用户输入非整数导致流错误,或者数组越界访问,比如用户输入的玩家索引超出范围。 现在需要将这些可能性整理成步骤,指导用户逐步检查和修改代码。同时,提供修改后的代码示例,并解释每个修改的原因。 此外,用户可能不熟悉如何在Dev-C++配置编译器选项,比如启用C++11,需要给出具体步骤。例如,在工具->编译器选项中添加-std=c++11到编译器参数。 最后,确保用户了解如何正确运行程序,包括输入正确的人数范围,避免运行时输入错误导致崩溃。 </think>以下是针对Dev-C++运行报错的解决方案,包含常见错误排查和代码优化: --- ### ❗ 常见错误类型及解决方法 #### 1. **编译器版本问题(C++11特性支持)** - **错误现象**:`error: in C++98 'roles' must be initialized by constructor not by '{...}'` - **解决方案**:启用C++11标准 1. 打开Dev-C++ 2. 点击 `工具` → `编译器选项` 3. 在 `编译器` 标签页的 `编译时加入以下命令` 中添加: ``` -std=c++11 ``` #### 2. **虚析构函数缺失导致内存泄漏** - **错误现象**:程序运行后崩溃或内存异常 - **修复代码**:为基类添加虚析构函数 ```cpp class Player { public: virtual string role() = 0; virtual void nightAction() = 0; virtual ~Player() {} // 添加虚析构函数 bool alive = true; }; ``` #### 3. **random_shuffle弃用问题(C++17以上)** - **错误现象**:`error: 'random_shuffle' is not a member of 'std'` - **解决方案**:替换为`std::shuffle` ```cpp #include <random> // 新增头文件 // 修改initPlayers()中的打乱逻辑 unsigned seed = chrono::system_clock::now().time_since_epoch().count(); shuffle(players.begin(), players.end(), std::default_random_engine(seed)); ``` #### 4. **输入类型错误导致流崩溃** - **错误现象**:输入非数字时程序卡死 - **修复方案**:增加输入校验 ```cpp // 在nightPhase()和dayPhase()中替换输入代码 int getValidInput() { int input; while (!(cin >> input)) { cin.clear(); // 清除错误标志 cin.ignore(100, '\n'); // 丢弃无效输入 cout << "请输入有效数字: "; } return input; } ``` --- ### ✅ 优化后的完整代码 ```cpp #include <iostream> #include <vector> #include <map> #include <algorithm> #include <ctime> #include <cstdlib> #include <random> // 新增头文件 #include <chrono> // 新增时间库 using namespace std; class Player { public: virtual string role() = 0; virtual void nightAction() = 0; virtual ~Player() {} // 虚析构函数 bool alive = true; }; // 角色类实现(同原代码,此处省略) class WerewolfGame { public: // 输入验证函数 int getValidInput() { int input; while (!(cin >> input)) { cin.clear(); cin.ignore(100, '\n'); cout << "请输入有效数字: "; } return input; } // 修改初始化玩家顺序 void initPlayers() { players.clear(); for (auto& [role, count] : roles) { for (int i = 0; i < count; ++i) { if (role == "狼人") players.push_back(new Werewolf()); else if (role == "村民") players.push_back(new Villager()); else if (role == "预言家") players.push_back(new Seer()); else if (role == "女巫") players.push_back(new Witch()); } } // 使用shuffle替代random_shuffle unsigned seed = chrono::system_clock::now().time_since_epoch().count(); shuffle(players.begin(), players.end(), default_random_engine(seed)); } // 修改nightPhase中的输入逻辑 void nightPhase() { // ...其他代码不变 // 狼人输入示例 cout << "狼人请选择要击杀的目标索引: "; target = getValidInput(); // 使用验证函数 // ...其他代码不变 } // 修改dayPhase中的输入逻辑 void dayPhase() { cout << "全体投票选择处决玩家索引: "; int vote = getValidInput(); // ...其他代码不变 } }; int main() { srand(time(0)); WerewolfGame game(6); game.start(); // 安全释放内存 for (auto p : game.players) delete p; return 0; } ``` --- ### 🧪 Dev-C++配置指南 1. **新建项目**: - 文件 → 新建 → 项目 → 控制台应用程序 - 选择C++项目类型 2. **添加代码**: - 将完整代码粘贴到`main.cpp` - 确保删除原有自动生成的代码框架 3. **编译器设置**: - 工具 → 编译器选项 → 编译器 - 勾选 `在连接器命令中加入以下命令` - 添加参数:`-std=c++11` 4. **运行测试**: - 按 `F11` 编译并运行 - 输入人数时确保在4-12范围内 --- ### 📌 常见运行时错误排查 | 错误类型 | 可能原因 | 解决方案 | |-----------------------|---------------------------|------------------------------| | 程序立即崩溃 | 指针访问越界 | 检查输入索引是否在0~n-1范围 | | 无法编译 | 未启用C++11 | 检查编译器参数 | | 输入数字后卡住 | 未处理输入流错误 | 确认使用getValidInput()函数 | | 报错"undefined reference" | 未正确包含标准库 | 检查是否包含所有头文件 | --- ###
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值