【问题标题】:Specify how cmake creates visual studio project指定 cmake 如何创建 Visual Studio 项目
【发布时间】:2011-11-29 18:51:11
【问题描述】:

我正在为我的项目设置 cmake,并为它设置了一个测试项目。当它生成我的 Visual Studio 2010 项目时,我想让它成为我之前的项目。

  • 它创建了一个我不想要的 ALL_BUILD 和 ZERO_CHECK 项目。
  • 它将 .h 文件放入 External Dependencies 文件夹中。我想要一个包含所有 .h 文件的文件夹。
  • 我还想将一些文件分组到不同的过滤器下。就像在我的核心库中一样,我想将所有与数学相关的文件分组到一个文件夹中,并将所有与事件管理相关的文件分组到另一个文件夹中。
  • 在文件系统上,它将项目文件放在 /Lib/src 中。可能是因为我将它组织在代码文件夹中,但我不希望将它用于项目文件。
  • 我想设置不同的配置,所以我有 DebugOpenGL、DebugDirectX、ReleaseOpenGL、ReleaseDirectX,然后为这两种配置设置标志 USE_OPENGL 或 USE_DIRECTX。

在 windows 上构建时如何排除某些文件,在 linux 上构建时如何排除其他文件?就像我有 WindowWin.cpp 和 WindowLinux.cpp。


我已经尝试了您的建议,但无法正常工作:

#LibProject/src

FILE(GLOB test0_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test.h)
source_group(include0 FILES ${test0_headers})
FILE(GLOB test0_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)
source_group(source0 FILES ${test0_source})

FILE(GLOB test1_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test1.h)
source_group(include1 FILES ${test1_headers})
FILE(GLOB test1_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test1.cpp)
source_group(source1 FILES ${test1_source})

include_directories(${test0_headers} ${test1_headers})

add_library(LibProject  ${test0_headers} ${test1_headers} ${test0_source} ${test
1_source})

我现在有点工作了.. 只是我想要源组内的标题和源文件的子文件夹。

set(test_source0 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)
source_group(TEST FILES ${test_source0})

set(test_source1 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp)
source_group(TEST2 FILES ${test_source1})

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc)
add_library(LibProject  ${test_source0} ${test_source1})

这是我的解决方案:)

set(test_header
${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h)
set(test_source
${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)

source_group(TEST\\Headers FILES ${test_header})
source_group(TEST\\Source FILES ${test_source})

set(test2_header
${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h)
set(test2_source
${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp)
source_group(TEST2\\Headers FILES ${test2_header})
source_group(TEST2\\Source FILES ${test2_source})

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc)

add_library(LibProject
${test_header}
${test_source}
${test2_header}
${test2_source})

【问题讨论】:

标签: c++ visual-studio-2010 cmake


【解决方案1】:

要将文件分组到 Visual Studio 中的文件夹中,您可以使用:

# Include files
FILE(GLOB all_headers "include/*.h*")
source_group("include" FILES ${all_headers})

# Source files
FILE(GLOB all_srcs "src/*.cpp")
source_group("source" FILES ${all_srcs})

这会将位于 include 文件夹中的所有 .h 文件显示在 Visual Studio 中名为 include 的文件夹中。您的 cpp 文件也是如此。如果需要,您可以使用此技术在 CMake 中创建自己的结构。

对于 ALL_BUILD 和 ZERO_CHECK 读取 this answer。要禁用 ZERO_CHECK 的生成,请使用 set(CMAKE_SUPPRESS_REGENERATION true)

要在 OpenGL 和 DirectX 之间进行选择并设置适当的文件夹,您可以使用上面使用的相同技术,但将它们放在一个

if(${USE_OPENGL})
    FILE(GLOB ....)
endif()

我想你明白了。

【讨论】:

  • 使用 GLOB 可能不是最好的主意,因为如果缺少对项目至关重要的文件,它不会给您错误。如果您手动列出所有文件(我知道很多打字)CMake 如果找不到列出的文件会抱怨。
  • 要摆脱 ZERO_CHECK,您可以将 -DCMAKE_SUPPRESS_REGENERATION=0 选项传递给 cmake 命令行。
【解决方案2】:

我会回答我知道的:

ALL_BUILD 和 ZERO_CHECK 用于使您的项目与 CMakeFiles 的更改保持同步。我认为没有办法摆脱这些。

要在所需位置获取 .h 文件,您需要将它们作为源代码的一部分包含在内。我使用这样的东西:

file(GLOB LocalProjectIncludes "${yourheaderdirectory}/*.h")

然后我将 ${LocalProjectIncludes} 附加到项目的源文件中。 CMake 会发现它们是标题;它不会尝试构建它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多