【问题标题】:How to switch between GCC and Clang in Clion from within CMakeLists.txt using windows/cygwin如何在 CMakeLists.txt 中使用 windows/cygwin 在 Clion 中的 GCC 和 Clang 之间切换
【发布时间】:2015-05-22 14:43:22
【问题描述】:

我放了

 set(CMAKE_CXX_COMPILER           "/usr/bin/clang.exe")

运行/清理,运行/构建。

我收到如下链接错误:

undefined reference to `std::ios_base::Init::~Init()'
: undefined reference to `__gxx_personality_v0'

大概还有其他变量需要改变。尝试将-lstdc++ 添加到CMAKE_CXX_FLAGS,但没有什么不同。

例如,是否有 CLion 方式而不是 CMake 方式?

谢谢。

【问题讨论】:

  • 尝试将--stdlib=libstdc++与clang一起使用。
  • C++ 编译器被称为clang++,您使用的是C 编译器
  • 请不要在CMakeLists.txt 中对编译器进行硬编码。请改用命令行选项-DCMAKE_CXX_COMPILER=...-DCMAKE_C_COMPILER=...

标签: c++ gcc clang clion


【解决方案1】:

使用 CMake 指定编译器有点微妙。虽然您使用的方法是在 CMakeLists.txt 中设置 CMAKE_CXX_COMPILER 有效,但这是CMake FAQ 中最不推荐的方法。

CLion 支持 CMake FAQ 的方法 2:在 cmake 调用中使用 -D。在 CMakeLists.txt 中设置变量没有效果。

在 Mac 上,转到 Preferences

在 Linux/Windows 上,转到 File | Settings

然后Build, Execution, Deployment | CMake | CMake options并输入文字:

-D CMAKE_C_COMPILER=/path/to/c_compiler
-D CMAKE_CXX_COMPILER=/path/to/c++_compiler

详情请参阅CLion FAQ

另请注意,当您更改编译器时,您必须使 CLion cmake 缓存无效并重新启动,请参阅我在 How to clear CMake cache in Clion? 上的回答。

编辑

在我写完这个答案之后,CLion 添加了对多个构建目录的支持,正如 cmets 中的 @rubenvb 所指出的那样。这是另一条调查途径。

【讨论】:

  • 在最新版本的 CLion 中可能会出现问题:youtrack.jetbrains.com/issue/CPP-7800
  • 请注意,您可以有两个单独的构建目录(每个编译器一个),因此切换变得不那么痛苦,并且每次切换时都不需要完全重建。
  • 如果我只写“clang”,它不会为我写路径。 (写路径对我不起作用)。
【解决方案2】:

事实上,在 Windows 10 环境中运行的最新版本的 Clions 2018.2 可与 LLVM clang 版本 6 /6.0.1 甚至 7.0 以及 GCC mingw x64 win32 特定变体一起使用。

链接器默认设置为 GCC 而不是 Visual Studio

我想它也应该可以在 cygwin 上运行,设置与以下相同,也可以在许多流行的 c++ IDE 上运行。

x64 或 32 特定 GCC mingw 版本经测试可在 Clions 2018.2 上运行

\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0 或 mingw-w64\i686-8.1.0-win32-dwarf-rt_v6-rev0

CMake 构建设置如下

cmake_minimum_required(VERSION 3.10)
project(project_name )

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_C_COMPILER "c:/llvm/bin/clang.exe")
set(CMAKE_CXX_COMPILER "c:/llvm/bin/clang++.exe")
// target i686-pc-windows-gnu for 32bit 
set(CL_COVERAGE_COMPILE_FLAGS "-v -target x86_64-pc-windows-gnu -Wall -Wextra -std=gnu++17")
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${CL_COVERAGE_COMPILE_FLAGS}" )
add_executable(project_name   yourcpp.cpp)

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2016-07-07
    • 2016-10-27
    • 2015-03-24
    • 1970-01-01
    • 2017-09-25
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多