2012-03-19 72 views
1

我正在将一些代码移植到OpenBSD 5.0,我遇到了这个非常奇怪的问题。为什么OpenBSD的G ++使系统头默认为C链接?

我的编译设置使用-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处理系统包含这种方式必须是某种自定义攻击。

+0

您使用的是哪个版本的gcc?作为标准,gcc的版本比freebsd上的版本要旧。我相信你可以在openbsd上安装它的更高版本。希望这可以帮助 – gda2004 2013-05-22 11:57:25

回答

1

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

看来G ++将针对“老”系统时,如在此间表示这样做:

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

很老的系统中,一些预先定义的系统头文件目录中获得更多的特殊待遇。 GNU C++认为这些目录中的头文件中的代码被外部“C”块所包围。无法通过#pragma或命令行请求此行为。

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