【问题标题】:Avoid repeating the directory name for multiple file inclusions避免重复包含多个文件的目录名称
【发布时间】:2013-07-30 09:48:16
【问题描述】:

我有一个库的 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 目录,这样我就不必不断地拼写出来?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您也可以将 add_library 调用移至您的 source/CMakeLists.txt:

    set(LIB_FILES first.cpp)
    add_library(first ${LIB_FILES})
    

    然后在您的顶级 CMakeLists.txt 中使用 add_subdirectory

    add_subdirectory(source)
    

    【讨论】:

    • 我以为我提到我不想这样做,但我想我错过了那个案例。源文件位于source 目录正是因为我不想 要将构建文件放在源目录中。此外,我还包含不在 source 目录或其下方的文件。
    • 好的。但是使用out-of-source build(推荐的技术),构建文件不会成为问题。另外,既然我看到了您的目录结构,在您的add_library 调用中包含“include”文件夹的所有标题是很正常的,这样它们就会出现在像 MSVC 这样的 IDE 中。在这种情况下,根据@user1283078 的回答,使用几个macros 可能会更好。
    • @NicolBolas 这是正确的答案,或者至少是正确的操作方式。使用 CMake 进行源外构建非常简单。
    • @Antonio: "使用 CMake 进行源代码外构建很简单。" 所以,你的意思是我应该为我的项目,仅仅因为我想从an irregularly updated build system 过渡到一个有合理支持和更新的项目?我不认为我会那样做。仅仅因为您可以进行“源外构建”并不意味着您应该必须这样做。
    • @NicolBolas 原谅我,但我想不出源代码构建的一个好处,而且您不必更改目录结构中的任何内容,CMake 它是免费提供的
    【解决方案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
    )
    

    【讨论】:

    • 如果您在根 CMakeLists.txt 中定义宏,它也应该对子目录中的 cmakelists 可见
    • 或者你可以把它放在一个 .cmake 文件中并使用 include(mymacro.cmake)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-01-25
    • 2019-11-13
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多