私はいくつかのコードを 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 に対するある種のカスタム ハックでなければなりません。