构建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
相关产品推荐
相关产品推荐

