【发布时间】:2017-03-04 06:43:14
【问题描述】:
我写了一个CMakeLists.txt 来构建一个使用g++ 或clang++ 的项目。
为了捕获尽可能多的错误,我将libc++ 与-D_LIBCPP_DEBUG2=2(用于clang++)和libstdc++ 与-D_GLIBCXX_DEBUG 一起使用(用于g++ 和clang++)。
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -fno-inline -DDEBUG=1 -march=x86-64 -mtune=generic")
#[[
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG2=2")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG")
endif()
]]
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG=1 -march=native")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-fno-omit-frame-pointer -DNDEBUG=1 -march=native")
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -gline-tables-only")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Og -ggdb")
endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG=1 -march=native")
else()
message(STATUS "Wrong build type selected, defaulted to Debug.")
set(CMAKE_BUILD_TYPE "Debug")
endif()
注释掉的代码是我应该知道当前编译器将使用哪个库的地方。
如何做到这一点?我知道,libstdc++ 定义了__GLIBCXX__ 和libc++ 定义了_LIBCPP_VERSION,但是如何检测它们呢?
【问题讨论】:
-
我当然可以将这两个标志都传递给
clang调试模式。
标签: gcc cmake clang libstdc++ libc++