我正在將一些代碼移植到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處理系統包含這種方式必須是某種自定義攻擊。
您使用的是哪個版本的gcc?作爲標準,gcc的版本比freebsd上的版本要舊。我相信你可以在openbsd上安裝它的更高版本。希望這可以幫助 – gda2004 2013-05-22 11:57:25