我正在将一些代码移植到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处理系统包含这种方式必须是某种自定义攻击。
您使用的是哪个版本的gcc?作为标准,gcc的版本比freebsd上的版本要旧。我相信你可以在openbsd上安装它的更高版本。希望这可以帮助 – gda2004 2013-05-22 11:57:25