2012-03-19 10 views
1

私は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のカスタムハックでなければなりません。自立型のクロスコンパイラで作業するとき

+0

どのgccのバージョンをお使いですか?標準では、gccのバージョンはfreebsdのものより古いです。 OpenBSDにそれ以降のバージョンをインストールできると思います。お役に立てれば – gda2004

答えて

1

は最近、同じ問題に出くわしました。

「古い」のシステムをターゲットとする場合、ここで示されるように、G ++はこれを行いますようだ:非常に古いシステムで

http://tigcc.ticalc.org/doc/cpp.html#SEC9a

、事前定義されたシステムヘッダのディレクトリのいくつかは、さらに特別な治療を受けます。 GNU C++は、これらのディレクトリにあるヘッダ内のコードをextern "C"ブロックで囲むことを検討しています。 #pragmaまたはコマンドラインからこの動作を要求する方法はありません。

希望これは、ここでは、将来の旅行者にいくつかの洞察を提供することができます。

関連する問題