2

一些库不提供目标,而是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)

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

4

2 回答 2

2

您可以创建自己的目标:

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>
)
于 2022-02-08T16:42:54.653 回答
2

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

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)或类似...

于 2022-02-08T18:17:26.447 回答