如何正确使用带有包含列表的target_include_directories

Wor*_*der 6 cmake

我有一个设置,其中收集了多个要设置为包含目录的包含目录,如以下模拟所示:

add_library(testlib SHARED "")
set_target_properties(testlib PROPERTIES LINKER_LANGUAGE CXX)
list(APPEND includePath "/some/dir" "/some/other/dir")
target_include_directories(testlib PUBLIC
  $<BUILD_INTERFACE:${includePath}>
)
Run Code Online (Sandbox Code Playgroud)

现在的问题是以下

get_target_property(debug testlib INTERFACE_INCLUDE_DIRECTORIES)
message("${debug}")
Run Code Online (Sandbox Code Playgroud)

版画

/home/user/test-proj/$<BUILD_INTERFACE:/some/dir;/some/other/dir>
Run Code Online (Sandbox Code Playgroud)

出于某种原因,项目的绝对路径位于include目录之前。这导致了cmake的宣告:

CMake Error in src/hypro/CMakeLists.txt:
  Target "testlib" INTERFACE_INCLUDE_DIRECTORIES property contains path:

    "/home/user/test-proj/"

  which is prefixed in the source directory.
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式使用列表$<BUILD_INTERFACE>吗?

Wor*_*der 5

正如@Florian在评论中写道,确实$<BUILD_INTERFACE:>在引号中可以完成此工作:

target_include_directories(testlib PUBLIC
  "$<BUILD_INTERFACE:${includePath}>"
)
Run Code Online (Sandbox Code Playgroud)

原因是includePath这里是一个列表,因此包含一个;,cmake不喜欢在字符串外部。