6

我在使用 CMake 时遇到问题,我无法将我的文件添加到 Visual Studio 内的文件夹/过滤器中。

# Add folders to filters
file(GLOB_RECURSE DATABASE_SRCS     RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/database *.cpp *.h)
file(GLOB_RECURSE LOG_SRCS          RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/log *.cpp *.h)
file(GLOB_RECURSE NETWORK_SRCS      RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/network *.cpp *.h)
file(GLOB_RECURSE THREADING_SRCS    RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/threading *.cpp *.h)
file(GLOB_RECURSE UTILS_SRCS        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/utils *.cpp *.h)

source_group(database   FILES ${DATABASE_SRCS})
source_group(log        FILES ${LOG_SRCS})
source_group(network    FILES ${NETWORK_SRCS})
source_group(threading  FILES ${THREADING_SRCS})
source_group(utils      FILES ${UTILS_SRCS})

可能导致此问题的一个问题是GLOB_RECURSE' 返回位于${CMAKE_CURRENT_SOURCE_DIR}但相对于/database(或任何其他目录)的文件。

例如,有一个文件database/名为dbcore.cpp. 该文件被添加到DATABASE_SRCSas dbcore.cpp,但主目录(即${CMAKE_CURRENT_SOURCE_DIR})中的文件也被添加,但具有相对于 的路径database/,例如../common.h.

另一个问题可能是在 Visual Studio 项目内部,默认的“头文件”和“源文件”过滤器已经存在。

我正在使用 CMake 2.8.6 和 Visual Studio 11/2012。

4

1 回答 1

9

为避免file(GLOB_RECURSE...调用每次都返回所有文件,请使用以下内容:

file(GLOB_RECURSE DATABASE_SRCS
         RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
         ${CMAKE_CURRENT_SOURCE_DIR}/database/*.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/database/*.h)

这将设置应该使您的DATABASE_SRCS呼叫正常工作的值。database/dbcore.cpp;database/dbcore.h;...source_group

但是,从文档中file(GLOB

我们不建议使用 GLOB 从源代码树中收集源文件列表。如果添加或删除源时没有 CMakeLists.txt 文件更改,则生成的构建系统无法知道何时要求 CMake 重新生成。

要查看完整的详细信息,请运行

cmake --help-command file

列出项目文件的常用方法是手动将它们添加到 CMakeLists.txt。

要回答您的最后一个问题,如果 Visual Studio 的默认“头文件”和“源文件”为空(即所有文件都出现在其他文件夹中),它们不会出现。这些默认值的存在不会影响使用source_group.

于 2012-06-11T00:16:08.140 回答