OGRE学习杂记-2012.11.21

本文记录了作者使用OGRE 1.8.1版本进行学习的过程。重点介绍了引擎的架构特点,如资源数据与逻辑的良好隔离、监听者模式的应用等,并提到了计划从渲染流程的frameRendering系列函数入手进行深入研究。

决定开始有系统有、有针对性地学习一下OGRE,并以此来好好地了解一款引擎。
每天写点学习杂记,可以督促自己坚持下去。

1.8.1版的代码,例子依旧是DLL库形式,用一个SampleBrower来查找、切换例子
大量采用了监听者模式,不过相比来说,我更喜欢CEGUI的事件触发机制,也是用习惯的关系
Ogre::Root这是个核心类
资源数据跟逻辑做了一个很好的隔离,不过还没仔细深究
渲染方面,只找到了frameRenderingXX系列函数,打算先从这入手试试
不喜欢里面把左大括号写在代码末尾的方式,还是喜欢单独占一行,比较清晰明确
例子里好多类成员函数都是内联的,即定义实现都在头文件里,感觉头文件相当臃肿,不明白这样写的意义,难道只是为了图个省事?

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found suitable version "1.71.0", minimum required is "1.40.0") found components: thread system filesystem program_options regex iostreams date_time -- Looking for ignition-math6 -- found version 6.15.1 -- Searching for dependencies of ignition-math6 -- Looking for OGRE... -- Found Ogre Ghadamon (1.9.0) -- Found OGRE: optimized;/usr/lib/x86_64-linux-gnu/libOgreMain.so;debug;/usr/lib/x86_64-linux-gnu/libOgreMain.so -- Looking for OGRE_Paging... -- Found OGRE_Paging: optimized;/usr/lib/x86_64-linux-gnu/libOgrePaging.so;debug;/usr/lib/x86_64-linux-gnu/libOgrePaging.so -- Looking for OGRE_Terrain... -- Found OGRE_Terrain: optimized;/usr/lib/x86_64-linux-gnu/libOgreTerrain.so;debug;/usr/lib/x86_64-linux-gnu/libOgreTerrain.so -- Looking for OGRE_Property... -- Found OGRE_Property: optimized;/usr/lib/x86_64-linux-gnu/libOgreProperty.so;debug;/usr/lib/x86_64-linux-gnu/libOgreProperty.so -- Looking for OGRE_RTShaderSystem... -- Found OGRE_RTShaderSystem: optimized;/usr/lib/x86_64-linux-gnu/libOgreRTShaderSystem.so;debug;/usr/lib/x86_64-linux-gnu/libOgreRTShaderSystem.so -- Looking for OGRE_Volume... -- Found OGRE_Volume: optimized;/usr/lib/x86_64-linux-gnu/libOgreVolume.so;debug;/usr/lib/x86_64-linux-gnu/libOgreVolume.so -- Looking for OGRE_Overlay... -- Found OGRE_Overlay: optimized;/usr/lib/x86_64-linux-gnu/libOgreOverlay.so;debug;/usr/lib/x86_64-linux-gnu/libOgreOverlay.so -- Looking for ignition-math6 -- found version 6.15.1 -- Looking for ignition-transport8 -- found version 8.5.0 -- Searching for dependencies of ignition-transport8 CMake Error at /mnt/d/anaconda3/Library/lib/cmake/protobuf/protobuf-targets.cmake:42 (message): Some (but not all) targets in this export set were already defined. Targets Defined: protobuf::libprotobuf-lite, protobuf::libprotobuf, protobuf::libprotoc, protobuf::protoc Targets not yet defined: protobuf::libupb, protobuf::protoc-gen-upb, protobuf::protoc-gen-upbdefs, protobuf::protoc-gen-upb_minitable Call Stack (most recent call first): /mnt/d/anaconda3/Library/lib/cmake/protobuf/protobuf-config.cmake:16 (include) /usr/share/cmake/ignition-cmake2/cmake2/FindIgnProtobuf.cmake:29 (find_package) /usr/lib/x86_64-linux-gnu/cmake/ignition-transport8/ignition-transport8-config.cmake:92 (find_package) /usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake:244 (find_package) try5/uav_simulator/CMakeLists.txt:21 (find_package) -- Configuring incomplete, errors occurred! See also "/home/vivien/catkin_ws/build/CMakeFiles/CMakeOutput.log". See also "/home/vivien/catkin_ws/build/CMakeFiles/CMakeError.log". make: *** [Makefile:2658: cmake_check_build_system] Error 1 Invoking "make cmake_check_build_system" failed
11-17
<think> 我们正在处理一个CMake构建错误:'Some (but not all) targets in this export set were already defined'。这个错误表明在导出目标时,部分目标已经被定义过,而其他目标尚未定义。根据引用[1]和[2],错误信息中指出了已定义的目标(protobuf::libprotobuf)和未定义的目标(protobuf::libprotobuf-lite, protobuf::libprotoc, protobuf::protoc)。 引用[3]提到了一个具体的解决案例:在编译PX4时由于找不到Protobuf库而修改了FindIgnProtobuf.cmake文件。引用[4]则提到了一个PackageConfig.cmake.in文件,用于生成libConfig.cmake,其中包含组件检查和包含目标文件。 结合这些信息,我们可以推断错误通常发生在多个地方尝试导出同一个目标时,或者目标被重复定义。解决这个错误的一般思路如下: 1. **检查目标是否重复导出**:确保在同一个CMake项目中,相同的目标不会在多个地方被导出(例如,在多个`install(EXPORT ...)`命令中包含了同一个目标)。 2. **确保所有目标都被正确定义**:错误信息中列出了未定义的目标,需要检查这些目标是否在项目中创建。如果这些目标是由第三方库提供的,需要确保该第三方库已被正确找到并导入。 3. **检查find_package和target_link_libraries**:确保在使用`find_package`找到依赖包后,通过`target_link_libraries`将目标链接到项目时,目标名称拼写正确,且该目标确实由该包提供。 4. **避免多次包含同一个配置文件**:如果项目中有多个地方包含了同一个目标的配置文件,可能会导致重复定义。 5. **使用命名空间避免冲突**:在导出目标时,使用命名空间(如`PROTOC_NAMESPACE`)可以避免与其他项目中的目标冲突。 根据引用[3]中的案例,修改Find模块(如FindIgnProtobuf.cmake)可能是一种解决方案,特别是当CMake无法正确找到所有必要的目标时。但需要谨慎,因为修改系统级文件可能会影响其他项目。 下面我们将提供解决此错误的步骤: ### 步骤1:检查目标定义 确认在项目中所有需要导出的目标都已经正确定义。例如,错误中提到的`protobuf::libprotobuf-lite`等目标是否在项目中通过`add_library`或类似命令创建,或者是否通过`find_package(Protobuf REQUIRED)`正确导入。 ### 步骤2:检查导出语句 检查CMakeLists.txt中的`install(EXPORT ...)`命令。确保同一个目标不会被多个导出集导出。如果多个导出集包含同一个目标,则会导致重复定义。 例如,如果已经有一个导出集包含了`protobuf::libprotobuf`,那么在另一个导出集中就不应该再包含它。 ### 步骤3:检查第三方库的查找 如果未定义的目标来自第三方库(如Protobuf),则需要确保`find_package`能够找到该库的所有组件。例如: ```cmake find_package(Protobuf REQUIRED COMPONENTS libprotobuf libprotobuf-lite libprotoc protoc) ``` 然后检查是否每个组件都找到了,可以通过检查变量`Protobuf_FOUND`以及各组件是否提供了所需的目标。 ### 步骤4:检查生成的配置文件 如果项目生成一个配置文件(如`<PackageName>Config.cmake`),确保其中没有重复包含目标。引用[4]中的示例展示了如何生成配置文件,其中包含一个`check_required_components`来验证组件。 ### 步骤5:修改Find模块(如果需要) 如果问题出在第三方库的Find模块(如FindProtobuf.cmake)没有正确设置所有目标,可以尝试修改Find模块,或者升级CMake以使用更新的Find模块。 在引用[3]中,修改了FindIgnProtobuf.cmake文件。如果你确定是Find模块的问题,可以尝试修改它。但是,建议优先考虑在项目的CMakeLists.txt中修复,而不是修改系统级的Find模块。 ### 步骤6:清理构建目录 在修改CMakeLists.txt或Find模块后,务必清除构建目录(删除CMakeCache.txt和CMakeFiles目录),然后重新运行CMake。 ### 示例解决方案 假设错误是由于Protobuf库的查找问题引起的,我们可以尝试以下方法: 1. 在CMakeLists.txt中,确保使用`find_package`时指定所有必要的组件: ```cmake find_package(Protobuf REQUIRED COMPONENTS protobuf protobuf-lite protoc) ``` 2. 如果仍然找不到目标,可以尝试手动定义缺失的目标(作为临时解决方案): ```cmake if(NOT TARGET protobuf::libprotobuf-lite) add_library(protobuf::libprotobuf-lite INTERFACE IMPORTED) set_target_properties(protobuf::libprotobuf-lite PROPERTIES INTERFACE_LINK_LIBRARIES ${Protobuf_LITE_LIBRARY} ) endif() ``` 注意:这种方法需要知道目标对应的库路径(如`${Protobuf_LITE_LIBRARY}`),通常由`find_package(Protobuf)`设置。 3. 如果问题是由项目自身的导出目标冲突引起的,检查并合并导出集,确保每个目标只被导出一次。 ### 结论 该错误通常是由于目标重复导出或第三方库目标未正确定义引起的。按照上述步骤排查,可以解决此问题。如果问题仍然存在,请检查CMake生成的日志文件,以获取更多线索。 §§相关问题§§ 1. 如何正确使用CMake的`install(EXPORT)`命令? 2. CMake中`find_package`的工作原理是什么? 3. 如何编写一个正确的Config.cmake文件? 4. 如何避免CMake目标命名冲突? </think> ### 解决CMake构建中 "Some (but not all) targets in this export set were already defined" 错误 这个错误通常发生在CMake导出目标时,部分目标已被定义而其他目标尚未定义。以下是系统性的解决方案: #### 1. **检查目标重复定义** ```cmake # 在CMakeLists.txt中检查重复的目标定义 if(TARGET protobuf::libprotobuf) message(WARNING "Target protobuf::libprotobuf already defined!") # 引用[1][2] endif() ``` - 确保同名目标不会被多次定义 - 使用`add_library(... ALIAS)`代替重复定义 #### 2. **统一导出目标组** ```cmake # 正确示例:一次性导出所有相关目标 install(EXPORT MyTargets FILE MyTargets.cmake NAMESPACE my:: DESTINATION lib/cmake/MyProject INCLUDES DESTINATION include ) ``` - 确保所有目标`(protobuf::libprotobuf, protobuf::libprotobuf-lite等)`在同一`EXPORT`命令中导出 - 避免分散在多个`install(EXPORT)`命令中 #### 3. **修复第三方查找模块** [^3] ```bash # 修改Find模块(如引用[3]案例) sudo vim /usr/share/cmake/ignition-cmake2/cmake2/FindIgnProtobuf.cmake ``` 1. 定位到问题行(示例中第29行) 2. 确保所有目标`(libprotobuf, libprotobuf-lite等)`的查找逻辑一致 3. 添加缺失的目标定义: ```cmake # 在Find模块中添加缺失目标 if(NOT TARGET protobuf::libprotobuf-lite) add_library(protobuf::libprotobuf-lite INTERFACE IMPORTED) set_target_properties(protobuf::libprotobuf-lite ...) endif() ``` #### 4. **验证Config.cmake生成** [^4] ```cmake # 确保PackageConfig.cmake.in包含所有组件检查 @PACKAGE_INIT@ include(CMakeFindDependencyMacro) include("${CMAKE_CURRENT_LIST_DIR}/@TARGET_NAME@Targets.cmake") # 引用[4] # 添加缺失目标的检查 check_required_components( "@TARGET_NAME@" protobuf::libprotobuf protobuf::libprotobuf-lite # 添加缺失目标 protobuf::libprotoc ) ``` #### 5. **清理并重建** ```bash # 强制清理CMake缓存 rm -rf CMakeCache.txt CMakeFiles # 重新生成构建系统 cmake -B build -DCMAKE_VERBOSE_MAKEFILE=ON cmake --build build --target clean ``` #### 根本原因分析 1. **目标定义不一致**:部分目标被重复定义,而其他相关目标未定义[^1][^2] 2. **第三方模块缺陷**:Find模块未正确定义所有目标[^3] 3. **导出逻辑错误**:目标组被分割到多个导出集 4. **组件声明缺失**:Config文件未声明所有必需组件[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值