cmake检测哪个库libc ++或libstdc ++被配置为用于对抗g ++或clang ++

时间:2017-03-04 06:43:14

标签: gcc cmake clang libstdc++ libc++

我写了一个CMakeLists.txt来构建一个包含g++clang++的项目。

为了捕获尽可能多的错误,我同时使用libc++ -D_LIBCPP_DEBUG2=2clang++}和libstdc++ -D_GLIBCXX_DEBUG({{1} }和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++,但如何检测它们?

1 个答案:

答案 0 :(得分:1)

我认为您可以安全地为每个库传递两个定义。

但如果你真的想有条件地这样做,我建议使用CheckCXXSourceCompiles模块和以下代码:

#include <iostream>

int a =
#ifdef __GLIBCXX__
    1;
#else
    fgsfds;
#endif

int main(int argc, char* argv[])
{
return 0;
}

如果该代码编译,那么您使用的是libstdc ++。