如何在C++中检查CMake变量[重复]。

问题描述 投票:0回答:1

我有两种不同的CMake构建方式:一种是用emscripten构建,一种是用普通的g++构建。根据构建类型,我想执行某些c++代码块。我不知道该怎么做。

CMAKE文件。

cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
    # build with emscripten
else()
    # build regularly
    find_package(SDL2 REQUIRED)
    find_package(Freetype REQUIRED)
endif()
include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})

add_executable(project src/main.cpp src/glad.c src/Game.cpp)
target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

在C++中,我想做以下事情。

if( not_emscripten_build ) {
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
}
c++ cmake emscripten
1个回答
0
投票

在C++中不能访问CMake变量。但是,CMake可以设置编译器选项,特别是宏定义。这种宏可以被前处理器访问。在CMAKE文件中使用 target_compile_definitions 命令。


0
投票

经过一番尝试,我想到了以下使用编译定义的解决方案。


    cmake_minimum_required(VERSION 3.15)
    project(project)

    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

    if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
        add_compile_definitions(BUILD_TYPE="emcc")
    else()
        find_package(SDL2 REQUIRED)
        find_package(Freetype REQUIRED)
        add_compile_definitions(BUILD_TYPE="gcc")
    endif()
    include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} 
    ${FREETYPE_INCLUDE_DIRS})

    add_executable(project src/main.cpp src/glad.c src/Game.cpp)
    target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

在我的C++项目中,我包含了以下头文件。



    #ifndef JUMPYBLOCK_BUILDTYPE_H
    #define JUMPYBLOCK_BUILDTYPE_H
    const bool EM_BUILD = strcmp(BUILD_TYPE, "emcc") == 0;
    #endif //JUMPYBLOCK_BUILDTYPE_H

然后我就可以在C++中执行以下操作:



    if( !EM_BUILD) {
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 
        SDL_GL_CONTEXT_PROFILE_CORE);
    }

© www.soinside.com 2019 - 2024. All rights reserved.