c++ - 前置 INTERFACE_SOURCES
问题描述
我正在寻找一个INTERFACE
库,并指定INTERFACE_SOURCES
链接到它的库也构建这些源。
不幸的是,由于一些 LTO 问题,这些源需要在消费者的源之前编译和链接。
该INTERFACE_SOURCES
属性似乎将这些来源附加到消费者目标。是否可以预先添加它们?
我知道一种解决方法是只设置一个源变量并在目标中使用它,但如果可能的话,我想使用一个目标。
解决方案
CMake文档target_sources()
仅支持将源附加到列表中。一种解决方案是获取INTERFACE_SOURCES
列表并使用PREPEND
list 子命令将源添加到列表中:
# 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_SOURCES
contains 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以避免混乱。
推荐阅读
- regex - jmeter中用下划线替换空格的正则表达式
- c# - 如何向我现有的 Specflow 测试添加另一个参数?
- c++ - 使用 Boost.Asio 将 UDP 套接字绑定到特定的网络接口
- jasper-reports - 如何创建具有内行的表
- python - 使用这些节点中存在的给定元素在两个节点之间交换。Python-3.0 用于编写代码
- typescript - CodeMirror 与 Vanilla TypeScript 和 WebPack
- javascript - 如何从数组中删除空数组值(“”)?
- python - 如何在python中导入模块
- android - 扩展 Gradle 任务
- c# - 将 ByteArray 转换为 Python 中从 C# Windows.Graphic.Imaging 上的 SoftwareBitmap 帧接收到的图像文件