我正在将一些代码移植到 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 进行某种自定义黑客攻击才能以这种方式处理系统包含。