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 ++
构建一个项目.
I wrote an CMakeLists.txt
to build a project with either g++
or clang++
.
为了捕获尽可能多的错误,我同时使用了 libc ++
和 -D_LIBCPP_DEBUG2 = 2
(对于 clang ++
)和 libstdc ++
和 -D_GLIBCXX_DEBUG
(对于 g ++
和 clang ++
都适用).
To catch as many as possible bugs I use both libc++
with -D_LIBCPP_DEBUG2=2
(for clang++
) and 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()
注释掉的代码是我应该知道当前将与当前编译器一起使用的库的地方.
Commented out code is the point where I should to know which library currently will be used with current compiler.
如何实现这一目标?我知道, libstdc ++
定义了 __ GLIBCXX __
,而 libc ++
定义了 _LIBCPP_VERSION
,但是如何检测到它们?
How to achieve this? I know, that libstdc++
defines __GLIBCXX__
and libc++
defines _LIBCPP_VERSION
, but how to detect them?
推荐答案
我认为您可以放心地为每个库传递两个定义.
I think you can safely just pass both defines for each library.
但是,如果您真的想有条件地执行此操作,建议您使用CheckCXXSourceCompiles 模块,其代码如下:
But if you really want to do this conditionally, I'd recommend using CheckCXXSourceCompiles module with following code:
#include <iostream>
int a =
#ifdef __GLIBCXX__
1;
#else
fgsfds;
#endif
int main(int argc, char* argv[])
{
return 0;
}
如果该代码可以编译,则说明您使用的是libstdc ++.
If that code compiles, then you are using libstdc++.
这篇关于cmake检测将哪个库libc ++或libstdc ++配置为针对g ++或clang ++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!