我正在寻找一个INTERFACE
库,并指定INTERFACE_SOURCES
因此链接到它的库也可以建立这些源。
不幸的是,由于一些LTO问题,需要在消费者的来源之前对这些来源进行编译和链接。
INTERFACE_SOURCES
属性似乎将这些源附加到使用者目标。可以代替它们吗?
我知道一种解决方法是只设置一个source变量并在目标中使用它,但如果可能的话,我想使用一个目标。
答案 0 :(得分:0)
target_sources()
的CMake documentation仅支持附加列表中的源。一种解决方案是获取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
的初始列表仅包含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
如果需要在CMake文件中的多个位置添加源代码,则可以轻松地将其放入CMake function
中,以免造成混乱。