首页 > 解决方案 > 前置 INTERFACE_SOURCES

问题描述

我正在寻找一个INTERFACE库,并指定INTERFACE_SOURCES 链接到它的库也构建这些源。

不幸的是,由于一些 LTO 问题,这些源需要在消费者的源之前编译和链接。

INTERFACE_SOURCES属性似乎将这些来源附加到消费者目标。是否可以预先添加它们?

我知道一种解决方法是只设置一个源变量并在目标中使用它,但如果可能的话,我想使用一个目标。

标签: c++ccmakepropertiestarget

解决方案


CMake文档target_sources()仅支持将源附加到列表中。一种解决方案是获取INTERFACE_SOURCES列表并使用PREPENDlist 子命令将源添加到列表中:

# Get the initial list of INTERFACE_SOURCES for the target.
get_target_property(INITIAL_TARGET_SOURCES MyLib INTERFACE_SOURCES)
message("INITIAL_TARGET_SOURCES: ${INITIAL_TARGET_SOURCES}")

# Prepend the additional INTERFACE target sources (TestClass2.cpp) to the list.
list(PREPEND INITIAL_TARGET_SOURCES ${CMAKE_CURRENT_LIST_DIR}/TestClass2.cpp)
# Set the INTERFACE_SOURCES to the updated list.
set_target_properties(MyLib PROPERTIES
  INTERFACE_SOURCES "${INITIAL_TARGET_SOURCES}"
)

# Check that the target property was updated successfully.
get_target_property(UPDATED_TARGET_SOURCES MyLib INTERFACE_SOURCES)
message("UPDATED_TARGET_SOURCES: ${UPDATED_TARGET_SOURCES}")

在这里,最初的列表INTERFACE_SOURCEScontains only TestClass1.cpp,但在set_target_properties()调用之后,它包含TestClass2.cpp;TestClass1.cpp。这是打印的内容:

INITIAL_TARGET_SOURCES: C:/workspace/testproj/TestClass1.cpp
UPDATED_TARGET_SOURCES: C:/workspace/testproj/TestClass2.cpp;C:/workspace/testproj/TestClass1.cpp

function如果您需要在 CMake 文件中的多个位置预先添加源,您可以轻松地将其放入 CMake以避免混乱。


推荐阅读