一些库(例如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)
有没有办法将所有提供的变量包装到目标中。
最佳答案
您应该能够创建自己的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)
或类似操作...
关于cmake - 如何将外部路径(include、lib)和定义包装到 cmake 中的目标中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71037373/