我正在将一些代码移植到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以这种方式处理系统。
答案 0 :(得分:2)
最近在使用独立交叉编译器时遇到了同样的问题。
G ++似乎会在定位“旧”系统时执行此操作,如下所示:
http://tigcc.ticalc.org/doc/cpp.html#SEC9a
在非常旧的系统上,一些预定义的系统头目录得到了更加特殊的处理。 GNU C ++认为在这些目录中找到的标题中的代码被extern“C”块包围。无法使用#pragma或命令行来请求此行为。
希望这可以为这里的未来旅行者提供一些见解。