如何在CMakeLists.txt外获取CMake配置文件导出的目标列表?
获取CMake包导出目标的命令行方法
当然可以不用编写完整的CMakeLists.txt,直接通过CMake命令行执行临时脚本就能获取包导出的目标列表,以下是两种可行方案:
方案一:用CMake临时脚本(通用可靠)
直接在命令行中生成并执行一段CMake脚本,无需创建单独文件:
cmake -P <(echo " # 设置包配置文件所在的前缀路径 set(CMAKE_PREFIX_PATH /opt/foo/lib64/cmake) # 查找目标包,可按需添加版本要求,比如 Foo 1.0 REQUIRED find_package(Foo REQUIRED) # 获取当前构建系统中的所有目标 get_cmake_property(all_targets BUILDSYSTEM_TARGETS) # 遍历并输出导入的目标(即包导出的目标) foreach(target IN LISTS all_targets) if(TARGET \${target} AND TARGET_IS_IMPORTED(\${target})) message(STATUS \"导出目标: \${target}\") endif() endforeach() ")
这段脚本的核心逻辑:
- 通过
CMAKE_PREFIX_PATH指定包配置文件所在的父目录,确保find_package能找到FooConfig.cmake - 用
find_package加载包的配置,导入所有导出目标 - 过滤出带有
IMPORTED属性的目标,这些就是包导出的预构建目标
方案二:直接解析导出目标文件(快速但依赖格式)
如果包使用EXPORT命令生成了类似FooTargets.cmake的导出文件,可直接通过文本工具解析:
# 替换为实际的Targets文件路径 grep -E "^add_library|^add_executable" /opt/foo/lib64/cmake/foo/FooTargets.cmake | awk '{print $2}'
注意:这种方法依赖CMake导出文件的格式,若包的配置有特殊写法(比如用复杂的宏定义目标),结果可能不准确,仅适合快速验证。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

