私はOpenBSD 5.0にいくつかのコードを移植しています。私はこの非常に奇妙な問題に遭遇しました。なぜOpenBSDのG ++はシステムヘッダをCリンケージにするのですか?
私のビルド設定は、-isystem /usr/local/include
を使用しています。覚えておくことは難しいですが、私は、システムタイプの-Wall
の私の使用からコンパイラの警告の塊を避けるためにそれをしたと信じて - 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のカスタムハックでなければなりません。自立型のクロスコンパイラで作業するとき
どのgccのバージョンをお使いですか?標準では、gccのバージョンはfreebsdのものより古いです。 OpenBSDにそれ以降のバージョンをインストールできると思います。お役に立てれば – gda2004