【问题标题】:MacOs: How to change the C++ compiler and stdlibMacOs:如何更改 C++ 编译器和 stdlib
【发布时间】:2021-01-13 09:39:07
【问题描述】:

我有一个带有 CMake(和柯南)的 C++ 项目,我想将编译器切换到 GCC-10 及其对应的 stdlibc++。如何在 MacOS (Big Sur) 上执行此操作。

在 cmake 配置命令中指定 -DCMAKE_CXX_COMPILER=which g++-10 成功切换到我系统上的 g++ 10 编译器(与 brew 一起安装)。但是,我没有看到任何指示包含和 stdlib 已更改。

我的 buidld 命令如下所示:

/usr/local/bin/g++-10 -DCONCORE_USE_GLM=1 -DCONCORE_USE_OPENMP=1 -DCONCORE_USE_TBB=1 -DRC_USE_RTTI -I../test/. -I../test/../include -I../include -isystem /usr/local/Cellar/tbb/2020_U3/include -isystem /Users/lucteo/.conan/data/Catch2/2.11.0/catchorg/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /Users/lucteo/.conan/data/rapidcheck/20200131/_/_/package/d2dbafdccc1ddd834eb76a31bdfdc6cc51e23ec1/include -fsanitize=address -fsanitize=undefined  -D_GLIBCXX_USE_CXX11_ABI=1 -O3 -DNDEBUG -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -Wall -std=gnu++17 -MD -MT test/CMakeFiles/test.concore.dir/func/test_serializers.cpp.o -MF test/CMakeFiles/test.concore.dir/func/test_serializers.cpp.o.d -o test/CMakeFiles/test.concore.dir/func/test_serializers.cpp.o -c ../test/func/test_serializers.cpp

切换编译器和stdlib的最佳方式是什么?

【问题讨论】:

  • 你在cmake运行之前有没有尝试过common export CXXFLAGS="..." 和export CXX="..." ?
  • 添加 export CXX=/usr/local/bin/g++-10 CXXFLAGS="-isystem /usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/" ; cmake ... 产生相同的结果
  • 在使用非系统默认的 std 库时应小心,以防您考虑链接到具有 API 的其他库,您可以通过该 API 传递 std 库的类型。 libstdc++ 和 libc++ 不是二进制兼容的。

标签: c++ macos gcc cmake clang


【解决方案1】:

要更改 stdlib,您需要向编译器提供 -stdlib=stdlibc++ 标志以激活 stdlibc++。这可以通过 ccmake(打开高级模式(使用 t),并将 CMAKE_CXX_FLAGS 设置为 -stdlib=stdlibc++)或通过 CMakeLists.txt 中的等效指令来完成:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=stdlibc++")

您可能还需要set(CMAKE_EXE_LINKER_FLAGS "-stdlib=stdlibc++"):

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=stdlibc++")

要更新您的柯南个人资料(比如default),请使用以下命令:

conan profile update settings.compiler.libcxx=stdlibc++ default

注意: -stdlib 是一个 Clang 标志,不适用于任何已发布的 GCC 版本。 GCC 总是使用libstdc++,除非你用-nostdlib 选项告诉它不使用任何标准库(在这种情况下,你要么需要避免使用任何标准库功能,要么使用-I-L 和@987654334 @ 标志将其指向另一组头文件和库文件)。

【讨论】:

  • 添加这些标志后不久我得到编译错误:g++-10: error: unrecognized command-line option '-stdlib=stdlibc++'
  • @LucianRaduTeodorescu -stdlib 是 clang 的标志而不是 gcc。我更新了答案
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2011-10-10
  • 2021-09-30
相关资源
最近更新 更多