Mac上Clion编译报错找不到_ctermid.h头文件,Mac上Clion调试无法查看STL容器的元素值

问题描述

问题一

MacOS上的Clion在编译项目的时候编译不成功,出现

In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/wchar.h:90,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/cwchar:44,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/bits/postypes.h:40,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/iosfwd:40,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/ios:38,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/ostream:38,
                 from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/iostream:39,
                 from /Users/macbookpro/Documents/CLion/Test/main.cpp:2:
/usr/local/Cellar/gcc/11.2.0_3/lib/gcc/11/gcc/x86_64-apple-darwin19/11/include-fixed/stdio.h:219:10: fatal error: _ctermid.h: No such file or directory
  219 | #include <_ctermid.h>
      |          ^~~~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.

这样的报错,简单来讲是在编译的时候无法找到_ctermid.h这个文件。

问题二

使用CLion在对程序进行调试的时候,无法显示STL容器中的元素值,只能显示开始指针、结束指针等一些内存地址值,甚至有时候通过输入变量来查看的时候,表达式会莫名其妙显示expr failed,从而无法查看很影响调试的过程(由于问题暂时解决无法演示,寻找网图来解释,侵删)
请添加图片描述
我想要的结果:
请添加图片描述在调试的时候可以显示出STL的值。
由于问题一是由问题二引出的,接下来我将按照时间顺序讲述问题解决的过程,解决问题的最终方法(暂时不是正面解决)放在最后部分。

软件平台版本

  • Xcode 10.1
  • Clion 2021.3.4 专业版
  • MacOS 10.15.7 Catalina (前段时间由10.13一路升上来)
  • GCC9、GCC11
  • LLDB 13.0

问题二的研究过程

如果要解决问题二,目前有如下几种方案:

方案一:设置里面禁用GNU C++ 库渲染器

知乎上有人回答说通过在设置里面禁用GNU C++ 库渲染器,如下图所示,把圈住的勾去掉,然后重新打开项目,再次调试就没有问题了。
请添加图片描述
不知道这种方法在Windows上用处如何,但是在MacOS上是完全没有作用的。

方案二:通过写一个函数来传参打印

通过手写一个函数,就像打印的时候一样,调用函数表达式来打印出来想要的元素值。这种方法确实万能,但是当我一个容器内很多元素想要查看的时候,一个一个传参查看非常麻烦。

方案三:通过使用LLDB指令来打印

在调试的时候在终端中使用LLDB输入相应的调试指令来打印出来,这种方式也是万能的,但是需要一定的学习成本,要对调试器的指令比较熟悉才行,而且方法仍然不够便捷,每次运行都需要输入指令来查看内容。

方案四:安装GDB

看到有人说在Mac上CLion使用GDB的话可以查看STL元素的值,而LLDB是不可以的,由于我自己的Window上的Clion使用的MinGW带的GDB就可以查看STL元素的值,翻阅了很多文献发现从2017年开始,一直到现在都有人反映LLDB无法查看STL元素的问题,并且暂时没有看到完美解决的便于操作的方法,故决定采用GDB进行尝试。
CLion自己带了一个10.2版本的GDB,但是不知道是升级版本的问题还是怎么,当时用这个GDB的时候总会报出警告,然后把CLion卡死

BFD: /usr/lib/dyld(i386:x86-64): unknown load command 0x34
BFD: /usr/lib/dyld(i386:x86-64): unknown load command 0x34
BFD: /usr/lib/dyld(i386:x86-64): unknown load command 0x34

最终显示connect time out error,无法进行调试,并且设置断点的时候也无法停留命中,故尝试额外安装GDB。这部分参考网上的教程对GDB进行安装,主要参考
2020 年在 macOS 上设置 gdb
在macOS10.14上使用GDB的教程
这两篇文章,使用homebrew安装GDB,并设置签名证书使得电脑对其信任。
安装完成之后在CLion里面可以成功的在下图方框位置处看到有一个新的gdb被识别出来(由于我后面把他卸了,所以在截图上没明确显示),选中之后Clion会进行检测版本,但是很不幸的是:选中以后发现我的CLion最高只支持到11.1的GDB版本,而brew安装的是最新版本11.2,我直接当场气昏。
请添加图片描述
此外还有一个不幸的消息:安装GDB之后直接把我原来的gcc9替换成了最新的gcc11,将编译器都指向被替换的gcc11路径,并使用原有的LLDB调试器后,我测试了是否可以用其来进行编译,结果当然也很不幸,这时候出现了问题一。
请添加图片描述

问题一的引出及研究历程

这个时候我以为是最新的gcc11与gcc9不兼容,于是又把gcc11全部卸载,重新装上了gcc9,但是错误似乎不可逆,并没有消失,这意味着我Mac上的gcc环境完全不能使用,但是并没有详细准确的教程来解决这个问题,在网络上关于这个问题的资料几乎为0,我只在Stack Overflow上找到一篇帖子反映这个情况
在 macOS Mojave 10.14.6 上找不到 _ctermid.h
根据解答中所说进行了尝试,现将已尝试方法列在下面

方法一:重新安装brew和gcc

无效,这个在刚才已经尝试过,错误是不可逆转的。

方法二:安装macOS_SDK_headers_for_macOS_10.14

根据描述,我需要

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

来进行安装,但是我是10.15系统,系统中这个目录已经没有了。

方法三:删除CommandLineTools并重装

使用

(sudo) rm -rf /Library/Developer/CommandLineTools

把CommandLineTools删除掉,使用

xcode-select --install

进行重装。没有效果。

方法四:安装系统版本支持的最新的CommandLineTools

支持此说法的原因是,使用

xcode-select --install

安装的CommandLineTools不会安装版本最新的工具,总是安装Xcode10的版本,现在需要安装版本最高支持的工具来解决这个问题。由于无法从App store直接更新,于是我从
Xcode历代版本下载
下载了目前MacOS10.15可以支持的最新版本12.4,(需要登录app store账户)
请添加图片描述
需要查看相应系统支持的Xcode版本的可以在这个页面查到:
Xcode系统及相应版本支持
在下载安装好之后,在终端输入指令

xcrun --show-sdk-path

就可以查看当前使用的SDK了。
请添加图片描述
但是很遗憾的是,尽管这种方法看起来很靠谱,但是仍然没有在我的Mac上起作用。

方法五:设置CLion中CMAKE_OSX_SYSROOT:PATH

在方法四行不通之后,就没有可供查阅的根据这个问题的教程了,我只能翻阅大量资料,由于我是在一段时间前从10.13版本升级到10.15的,所以有没有可能是因为使用了较新的gcc版本导致出问题呢?于是我查阅了一些资料,主要汇集在下面这个帖子中:
升级到 Catalina 10.15 后无法在 Mac 上编译 C 程序
大多数回答的观点是,由于更新到10.15系统之后,头文件的文件夹发生了变化,但是寻找的路径没有发生改变,所以会出现找不到的情况,通过对他们进行连接到相应文件夹就可以了。
但是我查看了那些文件夹,发现自己的问题与他们其实并不相同。就在这个时候我重新查看了报错信息,发现了这样一个消息
请添加图片描述
在编译的时候cmake其实是寻找Xcode中安装的SDK的,但是他使用的SDK并不是方法四中我们选择的SDK,而是XCode中的老SDK,于是我进入了这个文件夹里面进行了查看

cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/

发现在这个SDK的头文件里面果然没有_ctermid.h头文件。
请添加图片描述
在此之后我查看了方法四中我们更新后的CommandLineTools里面的SDK

cd /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/

发现在这里面是含有_ctermid.h头文件的
请添加图片描述
这时候我大概明白了原因:由于我之前使用的一直是从10.13遗留下来的老版本gcc9,在10.14版本以前都是没有_ctermid.h头文件的,而在当我把gcc更新到11版本之后,由于使用brew进行安装,其默认会寻找适配于当前系统下的gcc版本,而在10.15版本中,无论是gcc11还是gcc9,他们都需要这个头文件,这就是就算把版本回退到了9版本编译仍然失败的原因。
所以可以看出,CLion使用的还是旧的SDK,是否可以通过更改CLion所指定的SDK路径来让他用上我新安装的SDK呢?经过一番查找,我发现在项目里面的CMakeCatch.txt文件里面可以更改指定的SDK路径。
请添加图片描述请添加图片描述
我将上图中的PATH更改为安装的CommandLineTools里面的SDK路径,结果却出现了这样的报错

unsupported tapi file type '!tapi-tbd' in YAML file '/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib/libSystem.tbd' for architecture x86_64

请添加图片描述
好家伙旧坑没填上又开一个新坑,简单查找了一番资料,该问题的出现不太好确定是哪里的问题,但是我个人感觉可能跟我Mac上混乱的C++版本有关,由于时间成本的关系,暂时没有在这个问题上进行深究,该方法失效。

结论

在试过上面方法之后,事情一度陷入了僵局,似乎并没有找到什么方法来直面解决这个问题。于是我抱着最后的希望查看了Xcode是否还能够成功编译,惊喜发现Xcode中还能够正常编译C++文件,可以看出Xcode是自己包含了一套内置的C++环境,且与外界隔绝的。
那么有没有一种方法能够将CLion使用上Xcode的这一套内在的编译系统呢?我在设置里面找到了这个。
请添加图片描述
生成器这个选项中最开始默认的是Ninja,而其中存在Xcode的选项,当选中Xcode的时候程序已经可以正常编译运行,如图所示,调试的时候STL容器也能够直接看到值,问题一和问题二从某种奇怪的角度上得以解决。
请添加图片描述

相关猜想

综上,通过在CLion的CMake生成器选项中选择Xcode,就可以使用Xcode的一套编译体制,并且尽管是通过LLDB调试器,仍然可以显示出STL容器的元素值。但是此方式并没有从正面解决该问题,目前整个Mac的C++版本仍然相对混乱,由于时间成本关系,我没有继续深入正面探索解决问题所在。但是根据目前试过的方法,对可能正面解决问题的方式作出如下猜想:

在解决问题一的方法四中,尽管将CommandLineTools更新至12.4版本,但是Xcode仍然是10.13时候的上古版本10.1,目前针对MacOS 10.15.7的最高Xcode支持版本为12.4,由于更新了CommandLineTools后仍然会进行报错是因为CLion使用的SDK与CommandLineTools的SDK并不是一个,但是是否会通过Xcode的升级,让其与CommandLineTools的版本进行匹配,进而更新CLion所使用的默认SDK使其可以在当前系统下执行的情况呢?这方面应该值得进一步探索。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要在CLion里添加graphics.h头文件,你需要打开CLion,然后在File菜单选择Settings,然后在左侧菜单点击Languages & Frameworks,然后点击C/C++,在右侧菜单点击“Additional Include Directories”,然后把graphics.h头文件所在的路径添加进去。 ### 回答2: 在CLion添加graphics.h头文件可以按照以下步骤进行操作: 1. 首先,确保已经安装了支持图形编程的相关库文件和工具。对于C/C++语言而言,常用的图形编程库是graphics.h。如果还没有安装,可以在网上搜索并下载合适的库文件。 2. 打开CLion,创建一个新的C/C++项目,或者打开一个已有的项目。 3. 在项目的源代码文件夹,右击鼠标,选择"New" -> "C/C++ Source File",创建一个新的源代码文件(例如,main.cpp)。 4. 打开新创建的源代码文件,在文件的开头添加如下代码:`#include<graphics.h>` 5. 此CLion会显示一个红色下划线,表示不到头文件解决此问题,需要进行一些额外的配置。 6. 点击CLion窗口上方的“File”菜单,选择“Settings”。 7. 在弹出的设置窗口,选择“Build, Execution, Deployment” - “CMake”,然后点击“+”按钮添加一个新的CMake选项。 8. 在新添加的CMake选项,在“CMake Options”文本框,添加如下代码:`-lbgi -lgdi32 -luser32` 9. 点击“OK”保存设置。 10. 在代码编辑窗口,右键单击鼠标,选择“Reload CMake Project”,重新加载项目。 11. 完成上述操作之后,CLion应该能够正常编译和链接使用graphics.h头文件的源代码了。 需要注意的是,graphics.h是一个较旧且仅适用于Windows平台的图形库,因此在不同的操作系统和开发环境下可能不兼容或无法使用。如需进行图形编程,推荐使用更先进的图形库,如OpenGL或SFML。 ### 回答3: 在CLion添加graphics.h头文件的步骤如下: 1. 首先确保你已经正确安装了graphics.h库文件。通常情况下,graphics.h是与Turbo C++集成使用的,它提供了一套用于绘制图形的函数。 2. 打开CLion,并打开你的C/C++项目。 3. 在项目文件夹创建一个名为"include"的文件夹(如果尚未存在)。 4. 将graphics.h文件复制到刚刚创建的"include"文件夹。 5. 在CLion打开你的源代码文件。 6. 在源代码文件的开头,使用`#include`指令引入graphics.h头文件。 7. 确保你已经正确配置了编译器以包含graphics.h库文件。在CLion,你需要配置CMakeLists.txt文件以链接图形库。 一个示例的CMakeLists.txt文件配置如下: ```cmake cmake_minimum_required(VERSION 3.20) project(YourProjectName) set(CMAKE_CXX_STANDARD 14) # 将你的源代码文件添加到项目 add_executable(YourProjectName main.cpp) # 链接图形库 target_link_libraries(YourProjectName ${CMAKE_SOURCE_DIR}/include/graphics.h) ``` 8. 保存并关闭CMakeLists.txt文件。 现在,你可以在CLion使用graphics.h库来绘制图形了。记得在代码添加正确的graphics.h库函数调用和绘制逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值