构建生成 Release,安装却按空配置查找
完整源码树在未指定 `CMAKE_BUILD_TYPE` 时,根项目保持空值,而 `octomap` 子目录进入后才把自己的局部值改成 Release。构建阶段于是生成 Release 导出文件,根目录安装阶段却按空配置执行并漏掉 `octomap-targets-release.cmake`;下游 `find_package(octomap)` 虽能找到包,`octomap::octomap` 导入目标却没有可用的库位置。

基于八叉树的概率三维占据地图框架,以紧凑层级结构表示自由、占据与未知空间,并同时提供核心 OctoMap 库、三维可视化工具 OctoVis 与动态距离变换库 dynamicEDT3D。
默认 Release 不是某个子目录的私有选择;完整发行包需要在创建目标前统一配置,而嵌入式子项目必须把决定权留给宿主。
CMAKE_BUILD_TYPE = ""Releasefind_package succeeds · imported location missing
set(CMAKE_BUILD_TYPE Release)在 add_subdirectory() 之前统一完整发行包
完整源码树在未指定 `CMAKE_BUILD_TYPE` 时,根项目保持空值,而 `octomap` 子目录进入后才把自己的局部值改成 Release。构建阶段于是生成 Release 导出文件,根目录安装阶段却按空配置执行并漏掉 `octomap-targets-release.cmake`;下游 `find_package(octomap)` 虽能找到包,`octomap::octomap` 导入目标却没有可用的库位置。
单配置生成器的默认构建类型是整个发行包的配置决策,必须在任何子目录创建目标之前确定;但同一源码作为 `add_subdirectory()` 嵌入宿主工程时,配置所有权属于宿主,子项目不能擅自改写。显式 Debug 与 Xcode 等多配置生成器也应保持调用方语义。
在顶层 `CMakeLists.txt` 中仅当当前源码就是顶层项目、生成器为单配置且调用方未指定类型时,预先设为 Release;octomap、octovis 与 dynamicEDT3D 的独立构建默认值增加同样的顶层作用域判断。这样完整发行包与独立子项目仍保留 Release 默认值,嵌入式构建则不再修改宿主配置。
顶层默认、显式 Debug、独立 octomap 以及宿主 `add_subdirectory()` 四种模式分别生成 release、debug、release 与 noconfig 导出,外部消费工程均完成配置、编译、链接和运行;Release/Debug 的 GCC、Clang 与 ROS Jazzy/Humble 工作流通过,既有接口和多配置生成器行为保持不变。