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

j2cgzkjk  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(152)

我写了一个CMakeLists.txt来构建一个使用g++clang++的项目。
为了捕获尽可能多的bug,我使用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,但是如何检测它们呢?

hpxqektj

hpxqektj1#

我认为你可以安全地为每个库传递这两个定义。
但如果你真的想有条件地这样做,我建议使用CheckCXXSourceCompiles模块,代码如下:

#include <iostream>

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

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

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

sauutmhj

sauutmhj2#

在源代码中,您可以:

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#if defined(__cplusplus) && defined(_LIBCPP_VERSION)
// This indicates that libc++ is being used
#   pragma message("libc++ version: " STR(_LIBCPP_VERSION))
#endif

#ifdef __GLIBCXX__
// This indicates that libstdc++ is being used
#   pragma message("libstdc++ version: " STR(__GLIBCXX__))
#endif

当你构建时,你应该看到:

main.cpp:38:10: warning: libstdc++ version: 20230801 [-W#pragma-messages]

Checkout也:https://iq.opengenus.org/find-glibc-version/

相关问题