为什么OpenBSD的G ++使系统头文件默认为C链接?

时间:2012-03-19 18:15:07

标签: gcc boost compiler-errors header-files openbsd

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

我的构建设置使用-isystem /usr/local/include。这很难记住,但我相信我这样做是为了避免大量的编译器警告,因为我在系统类型上使用-Wall - 比如BSD - 将Boost安装到/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以这种方式处理系统。

1 个答案:

答案 0 :(得分:2)

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

G ++似乎会在定位“旧”系统时执行此操作,如下所示:

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

  

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

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