2012-03-19 81 views
1

我正在將一些代碼移植到OpenBSD 5.0,我遇到了這個非常奇怪的問題。爲什麼OpenBSD的G ++使系統頭默認爲C鏈接?

我的編譯設置使用-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

您使用的是哪個版本的gcc?作爲標準,gcc的版本比freebsd上的版本要舊。我相信你可以在openbsd上安裝它的更高版本。希望這可以幫助 – gda2004 2013-05-22 11:57:25

回答

1

最近在使用獨立交叉編譯器時遇到了同樣的問題。

看來G ++將針對「老」系統時,如在此間表示這樣做:

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

很老的系統中,一些預先定義的系統頭文件目錄中獲得更多的特殊待遇。 GNU C++認爲這些目錄中的頭文件中的代碼被外部「C」塊所包圍。無法通過#pragma或命令行請求此行爲。

希望這可能爲未來的旅行者提供一些見解。