Почему в OpenBSD G ++ для системных заголовков по умолчанию используется связь C? - PullRequest
2 голосов
/ 19 марта 2012

Я портирую некоторый код на OpenBSD 5.0 ​​и столкнулся с этой очень странной проблемой.

В моих настройках сборки используется -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 для обработки системы, включенной таким образом.

1 Ответ

2 голосов
/ 29 января 2018

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

Похоже, G ++ сделает это при нацеливании на "старые" системы, как указано здесь:

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

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

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

...