为了账号安全,请及时绑定邮箱和手机立即绑定

macOS Catalina 升级后 Go 程序无法运行

macOS Catalina 升级后 Go 程序无法运行

Go
海绵宝宝撒 2022-07-04 16:59:20
这可能是一个奇怪的问题,但是在 MacOS Catalina 升级后,一些用 Go 编写的程序将无法在我的 MacBook Pro 上运行。然而,一个基本的“Hello World”程序运行,但是我正在使用使用net/http包编写程序我得到以下错误:注意:程序是正确的,它们在 Docker 容器中运行良好输出(IntelliJ):# runtime/cgoIn file included from gcc_darwin_amd64.c:6:/usr/local/include/pthread.h:331:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]/usr/local/include/pthread.h:200:2: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'/usr/local/include/pthread.h:331:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]/usr/local/include/pthread.h:200:34: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'/usr/local/include/pthread.h:540:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]/usr/local/include/pthread.h:200:2: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'/usr/local/include/pthread.h:540:6: error: macro expansion producing 'defined' has undefined behavior [-Werror,-Wexpansion-to-defined]/usr/local/include/pthread.h:200:34: note: expanded from macro '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'我已经尝试过的事情:重新安装go重新安装xcode检查GOPATH&GOROOT是否设置正确用过的:MacOS version - Catalina 10.15.6 Go version - go1.15.2 darwin/amd64
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

输入xcode-select -print-path终端窗口并检查您的安装目录。就我而言,输出是:/Applications/Xcode.app/Contents/Developer

如果情况相同,则在终端上使用以下命令可以解决问题:

sudo xcode-select --switch /Library/Developer/CommandLineTools

另一种选择是使用本期中提到的 CGO_CPPFLAGS 但它可以在会话中工作:

export CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-builtin-requires-header"



查看完整回答
反对 回复 2022-07-04
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

这是<pthread.h>macOS 工具附带的一个错误:

这个宏甚至是虚假的,原因不止一个!中的定义<pthread.h>是这样的:

#define _PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT \
    defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREAD_EPOCH) || (SWIFT_SDK_OVERLAY_PTHREAD_EPOCH < 1))

宏扩展没有正确括起来。宏在同一个文件中以这种方式使用:

#if !_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT

扩展为:

#if !defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREAD_EPOCH) || (SWIFT_SDK_OVERLAY_PTHREAD_EPOCH < 1))

!仅适用于第一个测试而不适用defined(SWIFT_CLASS_EXTRA)于整个布尔表达式。

编译器没有检测到这个问题,它只是抱怨defined来自宏扩展的预处理器运算符,它具有 C 标准中指定的未定义行为:

6.10.1 条件包含

[...]

约束

1 控制条件包含的表达式应该是一个整数常量表达式,除了:它可能包含以下形式的一元运算符表达式

defined identifier

或者

defined ( identifier )

它评估1标识符当前是否定义为宏名称(即,如果它是预定义的,或者它是否是#define预处理指令的主题,而没有#undef具有相同主题标识符的干预指令),0如果不是。

2 在所有宏替换发生后剩余的每个预处理标记(在将成为控制表达式的预处理标记列表中)应采用词法形式的标记(6.4)。

语义

3 表单的预处理指令

# if常量表达式换行组选择

# elif常量表达式换行组选择

检查控制常量表达式的计算结果是否为非零。

4 在评估之前,预处理标记列表中将成为控制常量表达式的宏调用被替换(除了那些由定义的一元运算符修改的宏名称),就像在普通文本中一样。如果令牌defined是作为替换过程的结果生成的,或者defined一元运算符的使用与宏替换之前的两种指定形式之一不匹配,则行为未定义。在执行了由于宏扩展和defined一元运算符而导致的所有替换之后,所有剩余的标识符(包括那些在词法上与关键字相同的标识符)都被替换为 pp-number0,然后将每个预处理令牌转换为一个令牌。结果标记组成控制常量表达式,根据 6.6 的规则进行评估。出于此令牌转换和评估的目的,所有有符号整数类型和所有无符号整数类型的行为就好像它们分别具有与header 中定义的类型intmax_t和定义相同的表示形式。这包括解释字符常量,这可能涉及将转义序列转换为执行字符集成员。这些字符常量的数值是否与表达式中出现相同字符常量时获得的值相匹配(除了在一个或uintmax_t<stdint.h>#if#elif指令)是实现定义的。此外,单字符字符常量是否可能具有负值是实现定义的。

这个相关的短语是如果令牌defined是作为这个替换过程的结果生成的,或者defined一元运算符的使用与宏替换之前的两种指定形式之一不匹配,则行为是未定义的。

目前尚不清楚生成只是意味着作为宏扩展的一部分生成,或者更具体地说是通过令牌粘贴生成。clang似乎认为任何defined由宏扩展产生的标记在#if控制表达式中都有未定义的行为。

出于这两个原因,这似乎是<pthread.h>苹果要修复的一个错误。


查看完整回答
反对 回复 2022-07-04
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

遗憾的是,所有的试训都没有奏效。

我已经使用 IntelliJ IDEA Ultimate 有一段时间了。所以我尝试使用 IDE 设置 Go SDK、GOROOT 和 GOPATH(我想到了一个想法)。

我在我的 MacBook 上卸载/删除了与 Go 相关的所有内容。

然后我在 IntelliJ IDEA 上安装了 Go 插件,果然提示 Go SDK 不可用,GOROOT 和 GOPATH 都没有设置。

我按照说明进行操作,其余的由 IntelliJ IDEA 负责!

它下载并安装了 Go SDK,让我选择 GOPATH,它索引了一些东西,现在一切都像魅力一样工作!


查看完整回答
反对 回复 2022-07-04
  • 3 回答
  • 0 关注
  • 433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信