【问题标题】:Is it possible to add files to a CMake generated solution folder in Visual Studio?是否可以在 Visual Studio 中将文件添加到 CMake 生成的解决方案文件夹中?
【发布时间】:2013-12-13 15:32:16
【问题描述】:

这个问题或多或少是这个问题的热身:

how to get cmake to add files to msvcs solution tree

它从来没有得到一个有效的答案,所以我想稍微改变一下:

是否可以使用 cmake 2.8.3 引入的 cmake 解决方案文件夹将文件直接添加到 vs 解决方案?我想做相当于 VS->Solution->Add->Existing Item 的 cmake。所以我的文件将出现在属于解决方案而不是项目的文件夹中。

我找到了如何使用解决方案文件夹将目标分组到文件夹中的示例,代码如下:

set_property( GLOBAL PROPERTY USE_FOLDERS ON)
set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER "Test") 

那么我可以在文件夹中添加文件而不是目标吗?

【问题讨论】:

    标签: c++ visual-studio cmake


    【解决方案1】:

    这可能是不可能的。

    CMake 将其资产组织到 projectstargets 中。该项目对应于 Visual Studio 的解决方案文件,而每个目标将在各自的解决方案中生成一个 Visual Studio 项目。

    现在的问题是 CMake 不允许将文件添加到 CMake 项目中。事实上,CMake 项目只不过是目标的集合,几乎不提供任何自定义选项。因此,您提到的 USE_FOLDERS 选项只能用于在解决方案中对 VS 项目进行分组,而不是单个文件。

    最接近您要求的可能是添加一个保存您的文件的custom target。但是,这仍然会在解决方案中生成一个 VS 项目(除了您的文件之外,它还包含一堆其他内容),而不是一个普通文件夹。

    【讨论】:

    • 感谢您的快速回答。我会投票给你,但我是一个声誉低下的人。那么,将 cmake 宏等全局文件添加到项目/解决方案中的常用方法是什么?
    • 没有“最好”的方法来做到这一点。 CMake 本身倾向于将与目标相关的所有文件放入该目标的 VS 项目中:例如,每个 VS 项目始终包含用于创建它的 CMakeLists.txt,即使这会导致相同的 CMakeLists.txt 在解决方案。因此,如果您选择至少是一致的类似方法。根据文件的性质和您的个人工作流程,组织文件的不同形式可能更有意义。例如,我个人从不在 VS 中编辑 CMake 文件,所以我根本不包含它们。
    • 我以前也这样做,但我最近为 VS 安装了 cmake 语法高亮插件,现在我在 VS 中编辑文件。我想我会使用“在所有目标中包含全局文件”的方法,在目标中包含一个包含文件的额外文件夹。
    【解决方案2】:

    如果我正确理解了这个问题,我想我知道该怎么做:

    set(FILES_TO_ADD
        file1
        file2
        file3)
    
    source_group("Group Name" FILES ${FILES_TO_ADD})
    

    source_group 命令在 Visual Studio 项目中创建文件夹。

    【讨论】:

    • 不,我想在 Visual Studio 解决方案级别上创建一个文件夹。正如您所说,您的建议在 Visual Studio 项目下创建一个文件夹。我想为实际上不属于任何目标的文件创建一个文件夹,例如包含 CMake 函数或全局宏等的文件...在 VS GUI 中,您可以将项目添加到解决方案中,它将创建一个名为“Soultion项目”。这就是我想用 CMake 实现的目标,但我失败了
    • @Knitschi:你能做到吗?
    • @munsing 不,我仍在使用下面的解决方法,我添加了一个额外的自定义目标,它什么都不做,并且包含全局文件。
    【解决方案3】:

    此答案只是为 ComicSansMS 在接受的答案中提出的“自定义目标”解决方案添加了一个示例。这是我目前用来添加全局文件的方法。

    set( SOLUTION_FILES 
        ${CMAKE_SOURCE_DIR}/CMakeLists.txt               # root CMakeLists file
        ${CMAKE_SOURCE_DIR}/cmake/macros.cmake           # cmake functions
        ${CMAKE_SOURCE_DIR}/CMakeInCodeDefinitions.h.in  # imported cmake variables
        # etc...
    )
    
    add_custom_target( GlobalFiles SOURCES ${SOLUTION_FILES})
    

    【讨论】:

    • 有希望的方法,但会导致目标始终过时,因此并非无害。
    • 你有什么问题吗?我经常使用它来简单地将各种文件添加到我的 Visual Studio 解决方案中,以确保它们包含在全局搜索中。至少对于 Visual Studio 生成器,在构建这样的目标时似乎没有做任何事情。也许像 ninja 这样的其他构建工具的行为有所不同。
    • 它执行无操作构建而不是跳过目标。开销很小,但它确实会导致构建日志中出现额外的“混乱”,如果 cmake 更直接地支持这将是不必要的。这是否是一个问题是主观的,但我个人宁愿没有这个问题。我同意您的提议是一种合理的解决方法,但(对我而言)不是一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2015-04-06
    • 2017-07-24
    • 2011-11-04
    • 2011-05-09
    相关资源
    最近更新 更多