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