xcode - 如何使用 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)
任何人都可以帮忙吗?提前致谢。
解决方案
我想我明白了,我应该在 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()
推荐阅读
- vuejs2 - Vue.js:如何跨 3 列进行路由
- c# - 用户登录 asp.net core 3 后 Cookie 身份验证未重定向
- python - AUTO ARIMA MODEL 在 python 中预测每小时数据
- java - 指针是否在本地声明的末尾关闭?
- java - 在Tomcat中将Spring引导部署为战争时未加载CSS JS和链接
- php - 为什么我得到 mysqli::real_connect(): (HY000/2002): No such file or directory 尝试登录 phpmyadmin
- elasticsearch - Elasticsearch 和 Kibana - Kibana 服务器尚未准备好
- excel - 在Excel中找到最长的连续增加序列
- powershell - Get-Content Add-Content 从TXT文件中的换行符开始,powershell
- python - 如何处理将任意数量的列表解析为字典