CMake库依赖Git子模块Freetype,跨项目引用时缺失依赖报错
解决CMake中
find_package(dearimgui)因缺失Freetype导入目标失败的问题 问题根源
你把dearimgui安装后,它的CMake配置文件会依赖Freetype的导入目标,但其他项目执行find_package(dearimgui)时,CMake找不到Freetype的目标——因为你的Freetype是作为子模块编译的,默认不会生成并安装自身的CMake配置文件,dearimgui的配置文件也没处理Freetype的依赖查找逻辑。
具体修复步骤
1. 让Freetype子模块生成并安装CMake配置文件
打开Freetype子模块的CMakeLists.txt,在文件末尾添加以下代码:
# 导出Freetype目标,生成配置文件 install(EXPORT FreetypeTargets FILE FreetypeTargets.cmake NAMESPACE Freetype:: DESTINATION lib/cmake/Freetype ) # 生成版本配置文件 include(CMakePackageConfigHelpers) write_basic_package_version_file( "FreetypeConfigVersion.cmake" VERSION ${FREETYPE_VERSION} COMPATIBILITY SameMajorVersion ) # 生成主配置文件(需要先写一个FreetypeConfig.cmake.in模板) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/FreetypeConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/FreetypeConfig.cmake" INSTALL_DESTINATION lib/cmake/Freetype ) # 安装所有配置文件 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/FreetypeConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/FreetypeConfigVersion.cmake" DESTINATION lib/cmake/Freetype )
如果Freetype子模块目录下没有FreetypeConfig.cmake.in文件,自己新建一个,内容如下:
@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/FreetypeTargets.cmake") check_required_components(Freetype)
2. 修改dearimgui顶层CMakeLists.txt,传递Freetype依赖
- 首先,确保dearimgui链接Freetype时使用
PUBLIC,让依赖能传递给下游项目:
# 替换你原来的target_link_libraries语句 target_link_libraries(dearimgui PUBLIC Freetype::Freetype)
- 然后,修改dearimgui的CMake配置文件模板(比如
dearimguiConfig.cmake.in),添加Freetype的依赖查找:
@PACKAGE_INIT@ # 先查找Freetype依赖 find_dependency(Freetype REQUIRED) # 导入dearimgui目标 include("${CMAKE_CURRENT_LIST_DIR}/dearimguiTargets.cmake") check_required_components(dearimgui)
3. 确保安装时包含Freetype
如果Freetype子模块自己的CMakeLists没有安装逻辑,在顶层CMakeLists.txt中添加:
# 假设你的Freetype子模块路径是thirdparty/freetype add_subdirectory(thirdparty/freetype) # 安装Freetype库文件 install(TARGETS freetype EXPORT FreetypeTargets DESTINATION lib)
4. 重新编译安装
执行以下命令重新编译并安装整个项目:
mkdir -p build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/你想要的安装路径 make install
这样,其他项目再执行find_package(dearimgui)时,CMake会自动先找到Freetype的配置文件,导入对应的目标,就能正常使用dearimgui了。
内容的提问来源于stack exchange,提问作者Suxin
相关产品推荐
相关产品推荐

