OGRE学习杂记-2012.11.21

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

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

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

演示了为无线无人机电池充电设计的感应电力传输(IPT)系统 Dynamic Wireless Charging for (UAV) using Inductive Coupling 模拟了为无人机(UAV)量身定制的无线电力传输(WPT)系统。该模型演示了直流电到高频交流电的转换,通过磁共振在气隙中无线传输能量,以及整流回直流电用于电池充电。 系统拓扑包括: 输入级:使用IGBT/二极管开关连接到全桥逆变器的直流电压源(12V)。 开关控制:脉冲发生器以85 kHz(周期:1/85000秒)的开关频率运行,这是SAE J2954无线充电标准的标准频率。 耦合级:使用互感和线性变压器块来模拟具有特定耦合系数的发射(Tx)和接收(Rx)线圈。 补偿:包括串联RLC分支,用于模拟谐振补偿网络(将线圈调谐到谐振频率)。 输出级:桥式整流器(基于二极管),用于将高频交流电转换回直流电,以供负载使用。 仪器:使用示波器块进行全面的电压和电流测量,用于分析输入/输出波形和效率。 模拟详细信息: 求解器:离散Tustin/向后Euler(通过powergui)。 采样时间:50e-6秒。 4.主要特点 高频逆变:模拟85 kHz下IGBT的开关瞬态。 磁耦合:模拟无人机着陆垫和机载接收器之间的松耦合行为。 Power GUI集成:用于专用电力系统离散仿真的设置。 波形分析:预配置的范围,用于查看逆变器输出电压、初级/次级电流和整流直流电压。 5.安装与使用 确保您已安装MATLAB和Simulink。 所需工具箱:必须安装Simscape Electrical(以前称为SimPowerSystems)工具箱才能运行sps_lib块。 打开文件并运行模拟。
-- 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、付费专栏及课程。

余额充值