如何将外部路径(包括、lib)和定义包装到 cmake 中的目标中

How to wrap external paths (include, lib) and definitions into a target in cmake

某些库(如 LibRaw)生成的变量包含有关包含路径、库路径和编译定义的信息,而不是提供目标。在LibRaw的情况下,vcpkg推荐如下用法:

target_compile_definitions(main PRIVATE ${LibRaw_DEFINITIONS})
target_include_directories(main PRIVATE ${LibRaw_INCLUDE_DIR})
target_link_libraries(main PRIVATE ${LibRaw_LIBRARIES})

但是,我宁愿在使用

链接库方面保持一致
target_link_libraries(main PRIVATE LibRaw)

有没有办法将所有提供的变量包装到一个目标中。

您可以创建自己的目标:

add_library( MyLibRaw INTERFACE IMPORTED )

set_target_properties(MyLibRaw 
    PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES ${LibRaw_INCLUDE_DIR}
        IMPORTED_IMPLIB_DEBUG ${LibRaw_LIBRARIES_debug}
        IMPORTED_IMPLIB_RELEASE ${LibRaw_LIBRARIES_release}
        IMPORTED_LOCATION_DEBUG ${LibRaw_LIBRARIES_shared_debug}
        IMPORTED_LOCATION_RELEASE ${LibRaw_LIBRARIES_shared_release}
)

target_link_libraries(MyLibRaw 
    INTERFACE
        optimized $<TARGET_PROPERTY:MyLibRaw ,IMPORTED_IMPLIB_RELEASE>
        debug $<TARGET_PROPERTY:MyLibRaw ,IMPORTED_IMPLIB_DEBUG>
)

您应该能够创建自己的 interface library 并定义应应用于具有 INTERFACE 可见性的 main 目标的属性:

add_library(MyLibRaw INTERFACE)
target_compile_definitions(MyLibRaw INTERFACE ${LibRaw_DEFINITIONS})
target_include_directories(MyLibRaw INTERFACE ${LibRaw_INCLUDE_DIR})
target_link_libraries(MyLibRaw INTERFACE ${LibRaw_LIBRARIES})

这样每个链接目标链接 MyLibRaw 都会继承这些属性。

target_link_libraries(main PRIVATE MyLibRaw)

请注意,如果您在多个项目中重复使用目标,您可能需要创建一个提供此目标的查找脚本,如果您这样做 find_package(MyImports COMPONENTS LibRaw) 或类似...