cmake 检测哪个库 libc++ 或 libstdc++ 配置为用于 g++ 或 clang++
cmake detect which library libc++ or libstdc++ is configured to be used against g++ or clang++
我写了一个 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++。
我写了一个 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++。