【问题标题】:How to set C++ Language Dialect for a Xcode project using CmakeLists如何使用 CmakeLists 为 Xcode 项目设置 C++ 语言方言
【发布时间】:2020-04-20 19:34:44
【问题描述】:

我使用 Cmake 生成一个 Xcode 项目,在其构建设置中,“C++ 语言方言”和“C++ 标准库设置”是“编译器默认设置”,但我想将“C++ 语言方言”设置为“GNU+ +11 [-std=gnu++11]”并将“C++ 标准库”设置为“libc++(支持 C++11 的 LLVM C++ 标准库)”,那么我应该如何修改 CMakelists? 顺便说一下,这个项目是用来创建IOS .a文件的,我试过这个命令行,但是失败了:

if(NOT ${CMAKE_VERSION} VERSION_LESS "3.2" AND NOT APPLE)
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
else()
    message(STATUS "Checking compiler flags for C++11 support.")
    # Set C++11 support flags for various compilers
    include(CheckCXXCompilerFlag)
    check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11)
    check_cxx_compiler_flag("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
    if(COMPILER_SUPPORTS_CXX11)
        message(STATUS "C++11 is supported.")
        if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
        else()
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
        endif()
    elseif(COMPILER_SUPPORTS_CXX0X)
        message(STATUS "C++0x is supported.")
        if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++")
        else()
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
        endif()
    else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
    endif()
endif()

这是我的 CMakeLists:

cmake_minimum_required(VERSION 2.8)
project(Navigation C CXX)

if(NOT ${CMAKE_VERSION} VERSION_LESS "3.2" AND NOT APPLE)
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
else()
    message(STATUS "Checking compiler flags for C++11 support.")
    # Set C++11 support flags for various compilers
    include(CheckCXXCompilerFlag)
    check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11)
    check_cxx_compiler_flag("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
    if(COMPILER_SUPPORTS_CXX11)
        message(STATUS "C++11 is supported.")
        if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
        else()
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
        endif()
    elseif(COMPILER_SUPPORTS_CXX0X)
        message(STATUS "C++0x is supported.")
        if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++")
        else()
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
        endif()
    else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
    endif()
endif()


#MESSAGE(STATUS "WIN32 ${WIN32}")

if (WIN32)
 set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
 set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -D_CRT_SECURE_NO_WARNINGS /MTd")
 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG /MT /DEBUG:FASTLINK")
 set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -D_CRT_SECURE_NO_WARNINGS /MTd /Od")
 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG /MT /DEBUG:FASTLINK /O2 /Ob2")
endif (WIN32)


if (IOS)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -fembed-bitcode")
endif()

if (CMAKE_CL_64)
 message(STATUS "x64")
else (CMAKE_CL_64)
 message(STATUS "x86")
endif (CMAKE_CL_64)

OPTION(DEFINE_DT_POLYREF64 "use 64-bit refs" ON) 
if(DEFINE_DT_POLYREF64) 
 add_definitions(-DDT_POLYREF64) 
ENDIF(DEFINE_DT_POLYREF64) 

message(${PROJECT_SOURCE_DIR})
include_directories(
 "${PROJECT_SOURCE_DIR}/../../../Detour"
 "${PROJECT_SOURCE_DIR}/../../../Navigation"
 "${PROJECT_SOURCE_DIR}/../../Src"
 "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Include"
 "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Include"
 "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Include"
 )

#set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
#set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib/$(Platform)/${CMAKE_BUILD_TYPE}")

file(GLOB Detour "${PROJECT_SOURCE_DIR}/../../../Detour/*")
file(GLOB Navigation "${PROJECT_SOURCE_DIR}/../../../Navigation/*.*")
file(GLOB IO "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Source/*")
file(GLOB Load "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Source/*")
file(GLOB Container "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Source/*")
file(GLOB Client "${PROJECT_SOURCE_DIR}/../../Src/*")

source_group(\\Detour FILES ${Detour})
source_group(\\Navigation FILES ${Navigation})
source_group(\\Container FILES ${Container})
source_group(\\IO FILES ${IO})
source_group(\\Load FILES ${Load})
source_group(\\Client FILES ${Client})

if (APPLE)
 if(IOS)
  set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)")
  add_library(Recast STATIC ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
     set_xcode_property(Recast IPHONEOS_DEPLOYMENT_TARGET "9.0")
 else()
     set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
  add_library(Recast MODULE ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
     set_target_properties(Recast PROPERTIES BUNDLE TRUE)
 endif()
else()
    add_definitions(-DSDG_DLL_EXPORT)
 add_library(Recast SHARED ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
endif()

这是输出文件的一部分:

In file included from /Users/wutong/Desktop/Navigation/navigation/Detour/DetourTileCache.cpp:1:
In file included from /Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Detour/DetourTileCache.h:5:
/Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Navigation/Container/Include/Vector2.h:31:17: error: expected ';' at end of declaration list
    IntVector2() noexcept :
                ^
                ;
/Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Navigation/Container/Include/Vector2.h:64:50: error: expected ';' at end of declaration list
    IntVector2& operator =(const IntVector2& rhs) noexcept = default;
                                                 ^
                                                 ;
/Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Navigation/Container/Include/Vector2.h:73:65: error: no matching constructor for
      initialization of 'IntVector2'
    IntVector2 operator +(const IntVector2& rhs) const { return IntVector2(x_ + rhs.x_, y_ + rhs.y_); }
                                                                ^          ~~~~~~~~~~~~~~~~~~~~~~~~
/Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Navigation/Container/Include/Vector2.h:27:7: note: candidate constructor
      (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
class IntVector2
      ^
/Users/wutong/Desktop/Navigation/navigation/Client/Build/ios/../../../Navigation/Container/Include/Vector2.h:31:5: note: candidate constructor not viable: requires
      0 arguments, but 2 were provided
    IntVector2() noexcept :
...
...
...
** BUILD FAILED **


The following build commands failed:
 CompileC build_ios/Navigation.build/Release-iphoneos/Recast.build/Objects-normal/armv7/DetourTileCache.o /Users/wutong/Desktop/Navigation/navigation/Detour/DetourTileCache.cpp normal armv7 c++ com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)

有人可以帮忙吗?提前致谢。

【问题讨论】:

    标签: xcode cmake


    【解决方案1】:

    我想我明白了,我应该把这个写在if(IOS)语句范围内,所以我这样写我的CMakeLists,它很顺利。

    cmake_minimum_required(VERSION 2.8)
    project(Navigation C CXX)
    
    #MESSAGE(STATUS "WIN32 ${WIN32}")
    
    if (WIN32)
     set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
     set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -D_CRT_SECURE_NO_WARNINGS /MTd")
     set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG /MT /DEBUG:FASTLINK")
     set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -D_CRT_SECURE_NO_WARNINGS /MTd /Od")
     set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG /MT /DEBUG:FASTLINK /O2 /Ob2")
    endif (WIN32)
    
    
    if (IOS)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -std=c++11 -fembed-bitcode")
    endif()
    
    if (CMAKE_CL_64)
     message(STATUS "x64")
    else (CMAKE_CL_64)
     message(STATUS "x86")
    endif (CMAKE_CL_64)
    
    OPTION(DEFINE_DT_POLYREF64 "use 64-bit refs" ON) 
    if(DEFINE_DT_POLYREF64) 
     add_definitions(-DDT_POLYREF64) 
    ENDIF(DEFINE_DT_POLYREF64) 
    
    message(${PROJECT_SOURCE_DIR})
    include_directories(
     "${PROJECT_SOURCE_DIR}/../../../Detour"
     "${PROJECT_SOURCE_DIR}/../../../Navigation"
     "${PROJECT_SOURCE_DIR}/../../Src"
     "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Include"
     "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Include"
     "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Include"
     )
    
    #set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
    #set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib/$(Platform)/${CMAKE_BUILD_TYPE}")
    
    file(GLOB Detour "${PROJECT_SOURCE_DIR}/../../../Detour/*")
    file(GLOB Navigation "${PROJECT_SOURCE_DIR}/../../../Navigation/*.*")
    file(GLOB IO "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/IO/Source/*")
    file(GLOB Load "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/Load/Source/*")
    file(GLOB Container "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Include/*" "${PROJECT_SOURCE_DIR}/../../../Navigation/Container/Source/*")
    file(GLOB Client "${PROJECT_SOURCE_DIR}/../../Src/*")
    
    source_group(\\Detour FILES ${Detour})
    source_group(\\Navigation FILES ${Navigation})
    source_group(\\Container FILES ${Container})
    source_group(\\IO FILES ${IO})
    source_group(\\Load FILES ${Load})
    source_group(\\Client FILES ${Client})
    
    if (APPLE)
     if(IOS)
      set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)")
      add_library(Recast STATIC ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
         set_xcode_property(Recast IPHONEOS_DEPLOYMENT_TARGET "9.0")
     else()
         set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
      add_library(Recast MODULE ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
         set_target_properties(Recast PROPERTIES BUNDLE TRUE)
     endif()
    else()
        add_definitions(-DSDG_DLL_EXPORT)
     add_library(Recast SHARED ${Client} ${Detour} ${Navigation} ${IO} ${Container} ${Load})
    endif()
    

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多