2012-03-19 1 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

ответ

1

Недавно столкнулся с той же проблемой при работе с независимым кросс-компилятором.

кажется G ++ будет делать это при ориентации «старые» системы, как указано здесь:

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

На очень старых системах, некоторые из заранее определенных каталогов заголовка системы получают еще более специальное лечение , GNU C++ считает, что код в заголовках, найденных в этих каталогах, окружен внешним блоком «C». Невозможно запросить это поведение с помощью #pragma или из командной строки.

Надеюсь, это может дать некоторое представление будущим путешественникам здесь.