在我的项目中,我有多种依赖项,其中一些带有 cmake 文件,我可以很好地使用
target_link_libraries()
(例如 boost_program_options
),但有些则不然(例如 openssl
;我必须编译自定义版本出于兼容性原因),我必须使用 ExternalProject_Add
和 对于它们,然后我需要使用 target_link_libraries()
、target_compile_options()
和 target_link_options()
的混合,例如:
# This is only for certain libraries.
target_compile_options(my_program
PUBLIC
-I${OPENSSL_INSTALL_DIR}/include
)
# This is only for certain libraries.
target_link_options(my_program
PUBLIC
-L${OPENSSL_INSTALL_DIR}/lib
)
# This is only for everything, but I have to remember
# whether I add the target name or the actual library
# files.
target_link_libraries(my_program
PUBLIC
boost_program_options
libssl.a libcrypto.a
)
我宁愿做的是将其替换为以下内容:
# Everything in one place.
target_link_libraries(my_program
PUBLIC
boost_program_options
openssl_pseudo_target
)
其他地方有
openssl_pseudo_target
告诉 cmake
要使用的适当的编译/链接选项/库。
有什么办法可以做到这一点,或者达到类似的效果吗?
这就是接口库的用途。他们还提供了一个与您想要做的类似的示例:
另一个用例是针对使用需求采用完全以目标为中心的设计:
add_library(pic_on INTERFACE) set_property(TARGET pic_on PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON) add_library(pic_off INTERFACE) set_property(TARGET pic_off PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF) add_library(enable_rtti INTERFACE) target_compile_options(enable_rtti INTERFACE $<$<OR:$<COMPILER_ID:GNU>,$<COMPILER_ID:Clang>>:-rtti> ) add_executable(exe1 exe1.cpp) target_link_libraries(exe1 pic_on enable_rtti)
这样,exe1 的构建规范完全表达为链接目标,并且特定于编译器的标志的复杂性被封装在 INTERFACE 库目标中。