gcc - cmake 检测哪个库 libc++ 或 libstdc++ 配置为用于 g++ 或 clang++

标签 gcc cmake clang libstdc++ libc++

我编写了一个 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,但是如何检测它们呢?

最佳答案

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

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

#include <iostream>

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

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

如果该代码可以编译,那么您正在使用 libstdc++。

关于gcc - cmake 检测哪个库 libc++ 或 libstdc++ 配置为用于 g++ 或 clang++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593022/

相关文章:

c++ - 为什么cmake不允许<>样式包含?

C++ GL 链接器 undefined reference

linux -/usr/bin/ld : attempted static link of dynamic object `/usr/lib64/libm.so'

CMake:保留使用 cpack 创建的 deb 包中的文件权限?

c++ - "void value not ignored as it ought to be"非空函数

macos - 如何在我的新 MacBook Pro(配备 Mac OS Catalina)上安装 openMP?

c++ - 使用 clang 对 std::atomic 函数的调用不明确

c++ - 指针上的指针 - 性能损失的原因

c++ - GCC 函数多版本控制和命名空间

c++ - Makefile——高效编译