我可以创建一个cmake“伪目标”来为我执行编译/链接选项吗?

问题描述 投票:0回答:1

在我的项目中,我有多种依赖项,其中一些带有 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
要使用的适当的编译/链接选项/库。

有什么办法可以做到这一点,或者达到类似的效果吗?

c++ cmake
1个回答
0
投票

这就是接口库的用途。他们还提供了一个与您想要做的类似的示例:

另一个用例是针对使用需求采用完全以目标为中心的设计:

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 库目标中。

© www.soinside.com 2019 - 2024. All rights reserved.