如何将外部路径(包括、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)
或类似...
某些库(如 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)
或类似...