在CMake中将文件添加到source_group

时间:2012-06-10 20:38:47

标签: cmake

我遇到了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_SRCS添加到dbcore.cpp,但主目录中的文件(即${CMAKE_CURRENT_SOURCE_DIR})也会添加,但具有相对于database/的路径,例如{ {1}}。

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

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

1 个答案:

答案 0 :(得分:8)

为避免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创建的任何文件夹。