2

我正在将一些代码移植到 OpenBSD 5.0,我遇到了这个非常奇怪的问题。

我的构建设置使用-isystem /usr/local/include. 很难记住,但我相信我这样做是为了避免-Wall在安装 Boost 的系统类型(如 BSD)上使用大量编译器警告/usr/local/include。这似乎在 FreeBSD 上工作得很好。

所以采取以下程序:

#include <boost/array.hpp>

int main()
{
        return 0;
}

然后构建它:

c++ -O2 -pipe -isystem /usr/local/include -std=c++98 -o test test.cxx

在 OpenBSD 上,我发现我得到:

In file included from /usr/include/g++/string:46,
             from /usr/include/g++/stdexcept:44,
             from /usr/local/include/boost/array.hpp:35,
             from test.cxx:1:
/usr/include/g++/bits/stringfwd.h:48: error: template with C linkage

而且它只会从那里变得更糟。

我发现我可以通过执行以下操作来更改错误消息:

#include <stdexcept>

但这只会将问题推到更远的地方。就好像编译器将每个包含文件包装在一个extern "C"块中。

到目前为止,唯一的工作方法似乎是改回使用-I /usr/local/include并接受来自-Wall -W.

问题是,OpenBSD 为什么要这样做?必须对 GCC 进行某种自定义黑客攻击才能以这种方式处理系统包含。

4

1 回答 1

2

最近在使用独立的交叉编译器时遇到了同样的问题。

如此处所示,当针对“旧”系统时,似乎 G++ 会这样做:

http://tigcc.ticalc.org/doc/cpp.html#SEC9a

在非常旧的系统上,一些预定义的系统头目录得到了更加特殊的处理。GNU C++ 认为这些目录中的标头中的代码被外部“C”块包围。无法使用#pragma 或从命令行请求此行为。

希望这可以为这里的未来旅行者提供一些见解。

于 2018-01-29T19:19:07.737 回答