我有一个库的CMakeLists.txt文件。这很基本:
set(LIB_FILES source/first.cpp)
add_library(first ${LIB_FILES})
我将文件放在列表中,因为我最终会向库中添加更多源文件。问题是所有文件都在source
目录中。而且我不想经常重复这一点。
我也不想使用GLOB
模式匹配解决方案,因为我想在添加新文件时编辑CMakeLists.txt文件。这样,我的构建将重新构建构建解决方案,并且新文件将正确显示(据我所知。我仍然是CMake的新手。)
我尝试将CMakeLists.txt文件添加到source
目录中,只是为了构建LIB_FILES
列表。这不是很好。 CMake中的变量是文件范围。即使我打破范围界定(使用PARENT_SCOPE
),我仍然必须在每个文件前面加上目录。所以一无所获。
我不想将实际的库定义放在source
目录中,因为这将生成source
目录中的所有构建文件。我不希望这样。此外,我还需要包含不在source
目录中或下面的标题。
我的目录结构如下所示:
libroot (where the project build files should go)
\-source (where the source code is)
\-include (where the headers that the user of the library includes go)
那么我如何告诉CMake所有的源文件都来自source
目录,这样我就不必经常拼出来了?
答案 0 :(得分:3)
您也可以将add_library
来电转移到您的来源/ CMakeLists.txt:
set(LIB_FILES first.cpp)
add_library(first ${LIB_FILES})
然后在您的顶级CMakeLists.txt中使用add_subdirectory
:
add_subdirectory(source)
答案 1 :(得分:2)
你可以使用一个简单的宏
macro(AddSrc dst_var basepath_var)
foreach(file ${ARGN})
list(APPEND ${dst_var} ${basepath_var}/${file})
endforeach()
endmacro()
set(MY_SRCFILES "")
AddSrc(MY_SRCFILES path/to/source
foo.cpp
bar.cpp
whatever.cpp
)