【发布时间】:2019-03-09 20:39:57
【问题描述】:
外部项目由 CMake 构建并安装在通过 CMAKE_PREFIX_PATH 可见的目录中。由于它是 CMake 项目,它会安装正确的 .cmake 文件。在这些自动生成的文件中,会创建一个 EXPORTED 目标并设置所有必需的属性。
我想做的是 - 在不修改原始 CMakeLists.txt 的情况下 - 添加我需要的编译定义,以便正确包含此库中的标头。
到目前为止,我已经尝试了两种方法:
重新添加库并正常指定定义
add_library(_external_lib_name_ INTERFACE IMPORTED)
target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)
这不起作用,因为目标的所有已设置属性(如包含目录)都将被忽略。
只需添加定义
target_compile_definitions(_external_lib_name_ INTERFACE FOO_BAR)
这次CMake抱怨:
CMake Error at foo.cmake:1 (target_compile_definitions):
Cannot specify compile definitions for target "_external_lib_name_" which is not built by this project.
目前我正在考虑代理目标:
add_library(_proxy_target_ INTERFACE)
target_link_libraries(_proxy_target_ INTERFACE _external_lib_name_)
target_compile_definitions(_proxy_target_ INTERFACE FOO_BAR)
虽然这可能有效,但有谁知道是否有更好的方法来修改导入的目标?
更新:
使用 Tsyvarev 的回答,我能够使其工作,但还有另一个问题:为了正确修改目标,我需要 include 一个文件,首先是 find_package,然后是 set_property。如果我不使用include,而是使用标准CMakeLists.txt 和add_subdirectory,则目标会保留旧属性。
【问题讨论】:
标签: cmake