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

托米洛夫·阿纳托利

我写了CMakeLists.txt一个用g++构建一个项目clang++

为了捕捉尽可能多的错误,我同时使用libc++with -D_LIBCPP_DEBUG2=2(for clang++) 和libstdc++with -D_GLIBCXX_DEBUG(for both g++and 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++。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CMake区分libc ++和libstdc ++

来自分类Dev

CMake区分libc ++和libstdc ++

来自分类Dev

如何在Clang中检测libstdc ++版本?

来自分类Dev

如何在Clang中检测libstdc ++版本?

来自分类Dev

如何使用clang 3.6.0和libc ++构建cmake 3.1.3?

来自分类Dev

CMake测试:是否针对libc ++或libstd ++编译/链接了库?

来自分类Dev

使用clang的静态链接libstdc ++

来自分类Dev

在libc ++中使用g ++

来自分类Dev

CMake:针对libgcc和libstdc ++静态链接到共享库中

来自分类Dev

g ++无法识别-stdlib = libstdc ++

来自分类Dev

用clang编译libstdc ++时的问题

来自分类Dev

Windows上适用于Clang的CMake生成器

来自分类Dev

CMAKE:错误的链接器(g ++)用于可执行文件到CUDA库的链接

来自分类Dev

CMAKE:错误的链接器(g ++)用于可执行文件到CUDA库的链接

来自分类Dev

使用CMake而不是g ++链接GDAL库

来自分类Dev

在Linux上重现libc ++ / libstdc ++ ABI不兼容

来自分类Dev

在C ++ 14模式下使用Clang为libstdc ++编译正则表达式程序会导致错误

来自分类Dev

使用clang ++时默认启用libc ++ / libcxx

来自分类Dev

用clang和libc ++编译cln

来自分类Dev

用clang和libc ++编译cln

来自分类Dev

系统 libc 文件的 Clang 工具链失败

来自分类Dev

模板默认参数SFINAE与clang无关,适用于g ++

来自分类Dev

用于模板实例化的Clang / g ++选项

来自分类Dev

g ++静态链接到libstdc ++。a错误

来自分类Dev

在Linux上将libc ++链接到CMake项目

来自分类Dev

使用graphviz库配置CMake

来自分类Dev

如何使用libc ++ STL库为Android构建OpenCV?

来自分类Dev

Clang,LLVM和g ++

来自分类Dev

Clang,LLVM和g ++