首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clang++不尊重-isystem标志,这与g++的行为不同

clang++不尊重-isystem标志,这与g++的行为不同
EN

Stack Overflow用户
提问于 2021-02-23 00:25:42
回答 2查看 499关注 0票数 1

在我的macOS系统上,我安装了以下内容:

brew install protobuf@3.14

  • g++

  • Protobuf 3.14.0经brew install gcc@10

  • clang++ 1200.0.32.29经XCode

经 10.2.0_4

当我查看谷歌的Protobuf并使用clang++构建一个文件时,它似乎忽略了我传递的-isystem标志:

代码语言:javascript
复制
git clone https://github.com/protocolbuffers/protobuf.git && cd protobuf && git checkout 326ea555b
clang++ -std=c++17 -isystem src -c src/google/protobuf/any_lite.cc

这就产生了一个错误:

代码语言:javascript
复制
src/google/protobuf/any_lite.cc:56:19: error: return type of out-of-line definition of 'google::protobuf::internal::AnyMetadata::InternalPackFrom' differs from that in the declaration
bool AnyMetadata::InternalPackFrom(const MessageLite& message,
~~~~              ^
/usr/local/include/google/protobuf/any.h:108:8: note: previous declaration is here
  void InternalPackFrom(const MessageLite& message,
  ~~~~ ^
1 error generated.

这是因为#include 找到了文件/usr/local/include/google/protobuf/any.h。我希望它能找到文件src/google/protobuf/any.h,因为该文件存在,并且我传递了-isystem src。自3.14.0版本以来,私有函数InternalPackFrom的签名发生了变化,因此出现了错误。

另外,当我尝试用clang++替换g++-10时,我获得了一个成功的构建。(我的印象是,克郎努力争取国旗与GCC的兼容):

代码语言:javascript
复制
git clone https://github.com/protocolbuffers/protobuf.git && cd protobuf && git checkout 326ea555b
g++-10 -std=c++17 -isystem src -c src/google/protobuf/any_lite.cc

为什么clang++在这里忽略-isystem标志?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-25 22:15:29

结合Anton MalyshevAve Milia的回答/评论,明显的原因是苹果的自定义clang++版本(安装XCode时安装的)总是在系统开始时插入/usr/local/include包括路径列表,而不是任何其他条目,包括在命令行上传递的-isystem选项。(这可能是个bug)。您可以通过运行

代码语言:javascript
复制
clang++ -isystem /tmp -Wp,-v -E -

注意到这些台词

代码语言:javascript
复制
#include <...> search starts here:
 /usr/local/include
 /tmp

在输出中。

上游的clang++g++都没有这种行为,所以这是苹果设计的一个怪癖。

要解决此问题,可以使用Homebrew安装llvm

代码语言:javascript
复制
brew install llvm

然后,按照下面的指令输出,将Homebrew的clang++放到您的路径上

代码语言:javascript
复制
brew link llvm
票数 1
EN

Stack Overflow用户

发布于 2021-02-23 02:10:18

这不是因为-isystem src。出现此问题是因为clang++在其标准包含目录列表中包含路径/usr/local/include,而g++没有。

您可以使用以下命令检查标准包含目录的列表:

clang++ -nostdlib -Wp,-v -E -

g++-10 -Wp,-v -E -

为了避免包含/usr/local/include/google/protobuf/any.h by clang++,您可以删除文件或使用-nostdinc-nostdinc++标志,并手动传递旧的包含目录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66325376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档