CMake visual studio调试/发布配置

bit*_*gor 6 c++ configuration cmake visual-studio

我正在设置我的视觉工作室项目以使用CMake,但我有两个问题我还没有解决.

1如何为Release设置预处理器定义,为Debug设置另一个预处理器定义?

2我有一个带有opengl和directx的项目,所以对于DebugOpenGL和ReleaseOpenGL,我想从buld中排除所有directx cpp/h文件.使用DebugDirectX和ReleaseDirectx排除opengl文件.我该如何设置?

编辑:

到目前为止,我得到的是1.

cmake_minimum_required(VERSION 2.8)

project(TEngine)

if(CMAKE_CONFIGURATION_TYPES AND MSVC)
#DebugOpenGL flags
set(CMAKE_CXX_FLAGS_DEBUGOPENGL "/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_DEBUGOPENGL "/D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_DEBUGOPENGL "/debug /INCREMENTAL" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGOPENGL "/debug /INCREMENTAL" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#ReleaseOpenGL flags
set(CMAKE_CXX_FLAGS_RELEASEOPENGL "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_RELEASEOPENGL "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_RELEASEOPENGL "/INCREMENTAL:NO" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_RELEASEOPENGL "/INCREMENTAL:NO" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#DebugDirectX flags
set(CMAKE_CXX_FLAGS_DEBUGDIRECTX "/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_DEBUGDIRECTX "/D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_DEBUGDIRECTX "/debug /INCREMENTAL" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGDIRECTX "/debug /INCREMENTAL" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

#ReleaseDirectx flags
set(CMAKE_CXX_FLAGS_RELEASEDIRECTX "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C++ compiler during maintainer builds." FORCE)
set(CMAKE_C_FLAGS_RELEASEDIRECTX "/MD /O2 /Ob2 /D NDEBUG" CACHE STRING "Flags used by the C compiler during maintainer builds." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_RELEASEDIRECTX "/INCREMENTAL:NO" CACHE STRING "Flags used for linking binaries during maintainer builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_RELEASEDIRECTX "/INCREMENTAL:NO" CACHE STRING "Flags used by the shared libraries linker during maintainer builds." FORCE )

set(CMAKE_CONFIGURATION_TYPES "DebugOpenGL;ReleaseOpenGL;DebugDirectX;ReleaseDirectX")
set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
"Reset the configurations to what we need"
FORCE)

if(CMAKE_BUILD_TYPE STREQUAL "DebugOpenGL")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "ReleaseOpenGL")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "DebugDirectX")
    add_definitions(/DTE_USE_OPENGL)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "ReleaseDirectX")
    add_definitions(/DTE_USE_OPENGL)
endif()
endif()

set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
set(BOOST_ROOT "${TEngine_SOURCE_DIR}/Externals/boost_1_47_0")

if(WIN32)
    add_definitions(-DTEWINDOWS)
elseif(LINUX)
    add_definitions(-DTELINUX -DTE_USE_OPENGL)
endif()

subdirs(TEEngineTest TECore TEGraphics TEPhysics TEngine)
Run Code Online (Sandbox Code Playgroud)

bam*_*s53 15

  1. 如何为Release设置预处理器定义,为Debug设置另一个预处理器定义?

正确的方法是使用生成器表达式将COMPILE_DEFINITIONS属性设置在正确的范围内.

如果要向所有目标添加定义,请add_definitions()使用:

  set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
    $<$<CONFIG:DebugOpenGL>:_DEBUG>
    $<$<CONFIG:ReleaseOpenGL>:NDEBUG>
    $<$<CONFIG:DebugDirectX>:_DEBUG>
    $<$<CONFIG:ReleaseDirectX>:NDEBUG>
  )

  set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
    $<$<CONFIG:DebugOpenGL>:TE_USE_OPENGL>
    $<$<CONFIG:ReleaseOpenGL>:TE_USE_OPENGL>
    $<$<CONFIG:DebugDirectX>:TE_USE_DIRECTX>
    $<$<CONFIG:ReleaseDirectX>:TE_USE_DIRECTX>
  )
Run Code Online (Sandbox Code Playgroud)

您还可以仅为目标或特定源文件设置COMPILE_DEFINITIONS .见set_property.

为了设置其他编译标志,您可以COMPILE_OPTIONS像上面一样在目录,目标或源文件上设置属性.但是,您也可以使用该add_compile_options()命令,因为add_definitions()它不支持生成器表达式.您也可以设置COMPILE_OPTIONS目标,或使用target_compile_options().对于源文件,从CMake 3.3开始,您仍然需要设置COMPILE_FLAGS属性.

  set(MY_DEBUG_OPTIONS /MDd /Zi /Ob0 /Od /RTC1)
  set(MY_RELEASE_OPTIONS /MD /Ob2 /O2)

  add_compile_options(
    "$<$<CONFIG:DebugOpenGL>:${MY_DEBUG_OPTIONS}>"
    "$<$<CONFIG:ReleaseOpenGL>:${MY_RELEASE_OPTIONS}>"
    "$<$<CONFIG:DebugDirectX>:${MY_DEBUG_OPTIONS}>"
    "$<$<CONFIG:ReleaseDirectX>:${MY_RELEASE_OPTIONS}>"
  )
Run Code Online (Sandbox Code Playgroud)

请注意,在这些生成器表达式中放置选项列表需要引号add_compile_options().

  1. 我有一个带有opengl和directx的项目,所以对于DebugOpenGL和ReleaseOpenGL,我想从buld中排除所有directx cpp/h文件.使用DebugDirectX和ReleaseDirectx排除opengl文件.我该如何设置?

这可能是个问题.虽然可以使用生成器表达式有条件地将源文件添加到目标,但我不知道任何支持每个配置源文件的IDE.Visual Studio和CMake的Visual Studio生成器不支持它.Xcode和Xcode生成器也不支持这一点.因此,如果您想使用Visual Studio或其他IDE构建,则无法执行此操作.

一次使用单个配置的生成器,例如makefile或ninja生成器应该支持这个就好了.

不同配置之间的源文件不同,还有其他几个选项.这是一对夫妇.

您可以拥有多个目标,并且它们之间的来源不同:

set(OPENGL_SOURCES src/opengl/func1.cpp src/opengl/func2.cpp)
set(DIRECTX_SOURCES src/opengl/func1.cpp src/opengl/func2.cpp)

add_executable(opengl_foo ${COMMON_SOURCES} ${OPENGL_SOURCES})
add_executable(directx_foo ${COMMON_SOURCES} ${DIRECTX_SOURCES})
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着您可以回到只有调试和发布配置,这将简化您的配置的其余部分.

或者,您可以通过在源代码中使用一些间接来保持单独的OpenGL和DirectX配置.有一些'虚拟'cpp文件和头文件可以#include根据预处理器定义在你的opengl文件或directx文件之间切换:

// src/func1.h
#ifdef TE_USE_OPENGL
#  include "opengl/func1.h.inc"
#elif defined(TC_USE_DIRECTX)
#  include "directx/func1.h.inc"
#endif

// src/func1.cpp
#ifdef TE_USE_OPENGL
#  include "opengl/func1.cpp.inc"
#elif defined(TC_USE_DIRECTX)
#  include "directx/func1.cpp.inc"
#endif
Run Code Online (Sandbox Code Playgroud)

然后在CMake中简单地引用这些虚拟文件:

add_executable(foo src/func1.h src/func1.cpp)
Run Code Online (Sandbox Code Playgroud)

现在构建不同的配置将最终拉入不同的代码.此外,如果您继续将文件重命名为end in,.inc您甚至可以引用它们add_executable()以便它们显示在VS中,但VS不会尝试直接构建它们.


小智 8

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  add_definitions(/DYOURDEFINITION)
endif()
Run Code Online (Sandbox Code Playgroud)

将无法在MSVS多配置解决方案上下文中工作.为此你需要

set(MY_DEFINITION 
    $<$<CONFIG:Debug>:definition_for_debug>
    $<$<CONFIG:RelWithDebInfo>:definition_for_rel_with_debug>
    $<$<CONFIG:Release>:definition_for_release> 
    $<$<CONFIG:MinSizeRel>:definition_for_tight_release>
    )
Run Code Online (Sandbox Code Playgroud)


arr*_*owd 4

1:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  add_definitions(/DYOURDEFINITION)
endif()
Run Code Online (Sandbox Code Playgroud)

2:如果我理解正确,你需要创建一个选项变量

option(USE_OPENGL "Use OpenGL or DirectX")
Run Code Online (Sandbox Code Playgroud)

然后在添加新目标时检查它:

if(USE_OPENGL)
add_subdirectory(OpenGL)
else()
add_subdirectory(DirectX)
endif()
Run Code Online (Sandbox Code Playgroud)

当然,您应该在 OpenGL/ 和 DirectX/ 目录中创建 CMakeLists.txt。