首页 > 解决方案 > 如何使用 CmakeLists 为 Xcode 项目设置 C++ 语言方言

问题描述

我使用 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)

任何人都可以帮忙吗?提前致谢。

标签: xcodecmake

解决方案


我想我明白了,我应该在 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()

推荐阅读