外部项目由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
然后{ {1}}。如果我不使用set_property
,而是使用标准include
和CMakeLists.txt
,则目标将保留旧属性。
答案 0 :(得分:1)
命令target_compile_definitions
追加到属性INTERFACE_COMPILE_DEFINITIONS,但不适用于 IMPORTED 目标。您需要使用直接与目标属性配合使用的命令:
set_property(TARGET _external_lib_name_ APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS FOO_BAR)