如何在CMake项目中引入未生成config.cmake的外部项目组件
问题原因
你找不到config.cmake是正常现象:opensim-models是纯资源仓库,它自带的CMakeLists.txt仅做资源文件的安装规则定义,没有编写CMake包导出逻辑,也没有编译任何库/可执行目标,编译完成后自然不会生成可供find_package()调用的包配置文件,不需要反复检查编译流程是否出错。
可行操作方案
你不需要手动逐个拷贝资源文件,选以下任意一种方案即可完成引入:
方案1:手动编译安装后引用
你之前仅执行了编译命令,没有执行安装步骤,先补全安装流程,建议不要把资源装到系统默认目录,指定到你自己项目的第三方依赖目录方便管理:
cd clonedproj/build # 替换后面的路径为你自己项目下存放第三方依赖的实际路径 cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/your/project/3rdparty/opensim-models make -j$(nproc) make install
安装完成后,指定的安装前缀目录下会直接生成Models、Geometry等你需要的资源文件夹,在你自己项目的CMakeLists.txt中直接引用路径即可:
# 定义缓存变量,方便不同环境下修改路径 set(OPENSIM_MODELS_DIR "" CACHE PATH "Local path of installed opensim-models resources") # 校验路径有效性 if(NOT IS_DIRECTORY "${OPENSIM_MODELS_DIR}/Models") message(FATAL_ERROR "Please set valid OPENSIM_MODELS_DIR path, cannot find Models directory under given path") endif() # 用法1:代码中需要加载资源时,直接通过编译宏传入资源根路径 add_compile_definitions(OPENSIM_RES_ROOT="${OPENSIM_MODELS_DIR}") # 用法2:打包时把资源拷贝到你自己项目的输出/安装目录 install(DIRECTORY "${OPENSIM_MODELS_DIR}/Models" "${OPENSIM_MODELS_DIR}/Geometry" DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/opensim)
配置你自己的项目时,传入-DOPENSIM_MODELS_DIR=/path/to/your/project/3rdparty/opensim-models参数即可完成关联。
方案2:自动拉取引入(推荐,无需手动克隆编译)
直接用CMake内置的FetchContent模块,在你自己项目配置阶段自动拉取对应版本的仓库资源,省去手动克隆、编译、安装的步骤:
在你自己项目的CMakeLists.txt中添加以下内容:
include(FetchContent) FetchContent_Declare( opensim_models GIT_REPOSITORY https://github.com/opensim-org/opensim-models.git GIT_TAG v4.0 # 建议替换为你需要的固定版本tag/commit哈希,避免上游更新导致资源不一致 ) FetchContent_MakeAvailable(opensim_models) # 拉取完成后会自动生成opensim_models_SOURCE_DIR变量,指向仓库本地根目录 if(NOT IS_DIRECTORY "${opensim_models_SOURCE_DIR}/Models") message(FATAL_ERROR "Failed to fetch opensim-models resources") endif() # 后续资源引用、拷贝逻辑和方案1完全一致 add_compile_definitions(OPENSIM_RES_ROOT="${opensim_models_SOURCE_DIR}") install(DIRECTORY "${opensim_models_SOURCE_DIR}/Models" "${opensim_models_SOURCE_DIR}/Geometry" DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/opensim)
注意事项
这个仓库没有任何编译产物,本质就是一堆模型、几何文件的集合,完全不需要硬套find_package()的库引入流程,只要拿到资源目录的正确路径,按你项目的实际需求做路径关联、资源拷贝即可。
内容的提问来源于stack exchange,提问作者Ali Baradaran Birjandi
相关产品推荐
相关产品推荐

