You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建CMake依赖包bar时,如何调用依赖包foo的do_foo可执行文件?

在CMake中使用已安装的可执行目标foo::do_foo的惯用方法

不需要手动拼接foo_DIR来查找可执行文件,CMake的导入目标foo::do_foo本身就包含了所有必要的路径信息,以下是几种惯用的使用方式:

1. 直接在自定义命令/目标中调用目标

因为foo::do_foo是CMake识别的IMPORTED可执行目标,你可以直接在COMMAND字段中使用目标名,CMake会自动解析其绝对路径:

# 示例:通过自定义命令调用do_foo生成文件
add_custom_command(
  OUTPUT processed_data.txt
  COMMAND foo::do_foo --source raw_data.txt --dest processed_data.txt
  DEPENDS raw_data.txt
  VERBATIM
)

# 示例:创建自定义目标来触发do_foo执行
add_custom_target(run_do_foo
  COMMAND foo::do_foo --arg1 value1 --arg2 value2
  COMMENT "Running do_foo tool"
)

2. 获取可执行文件的绝对路径到变量

如果需要将路径存储到变量中供后续使用,可以通过get_target_property读取目标的IMPORTED_LOCATION属性:

get_target_property(DO_FOO_PATH foo::do_foo IMPORTED_LOCATION)

# 后续可直接使用${DO_FOO_PATH}引用路径
message(STATUS "Found do_foo at: ${DO_FOO_PATH}")

这个属性由CMake自动维护,会根据安装路径、构建类型(Debug/Release)等自动适配,比手动拼接路径可靠得多。

为什么不推荐手动拼接路径?

手动用${foo_DIR}/bin/do_foo的方式存在诸多问题:

  • 不同平台的二进制目录规则可能不同(比如Windows下Debug版本可能安装在bin/Debug目录)
  • 交叉编译场景下,安装路径结构会和主机环境完全不同
  • foo包可能通过CMAKE_INSTALL_BINDIR自定义了二进制安装目录,手动拼接会失效

关于fooTargets.cmake的说明

你看不到直接的路径引用是正常的:CMake会通过生成器表达式、配置条件等方式动态设置IMPORTED_LOCATION属性,适配不同的安装环境和构建类型,这些逻辑不会以硬编码路径的形式直接出现在fooTargets.cmake中,但目标的属性是完全有效的。

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 14:52:03