On Wed, Sep 14, 2011 at 11:08:48AM +0300, Igor Vlasenko wrote: > > В новом стандарте c++ char16_t превратился во встроенный тип и keyword, > http://en.cppreference.com/w/cpp/keywords/char16_t > в результате чего, например, новый xulrunner уже не определяет char16_t, > и сборка с помощью gcc45 оканчивается неудачей: [exec] //usr/include/xulrunner/nsStringAPI.h:1101:3: error: 'char16_t' was not declared in this scope [exec] make: *** [xpcomxul.o] Error 1 Значит, новый xulrunner неправильно собран, поскольку сам по себе он поддерживает системы как с HAVE_CPP_CHAR16_T, так и без них, см. /usr/include/xulrunner/xpcom-config.h
HAVE_CPP_CHAR16_T был выставлен в xpcom-config.h в момент сборки, когда char16_t был доступен. Если положить xpcom-config.h не заполненный (дефолтный), то всем кто будет использовать хэдеры xulrunner предётся заполнять его самостоятельно. Я не вижу способов как это исправить.
Если я правильно понял Дмитрия, то в нашем gcc45 нет встроенного char16_t, поэтому HAVE_CPP_CHAR16_T был выставлен в xpcom-config.h в момент сборки некорректно.
(В ответ на комментарий №2) > Если я правильно понял Дмитрия, Не будьте испорченным телефоном. > то в нашем gcc45 нет встроенного char16_t, поэтому > HAVE_CPP_CHAR16_T был выставлен в xpcom-config.h в момент сборки некорректно. xulrruner сам использует xpcom-config.h при сборке. Вот проверка: http://git.altlinux.org/people/legion/packages/xulrunner.git?p=xulrunner.git;a=blob;f=mozilla/configure.in;h=3447605ecaca93a0e54d718789dfcb4bfd09987e;hb=307c4eaefdad49e73914662be088ab0ebc43e105#l3005
Встроенный тип char16_t доступен только при компиляции в режиме C++0x (g++ -std=c++0x и g++ -std=gnu++0x). The default, if no C++ language dialect options are given, is `-std=gnu++98' Так что использовать заголовки xulrunner можно только в случае если компилятор используется в том же режиме что и во время статической проверки на тип char16_t во время сборки самого xulrunner. Объезд для клиентов xulrunner: export CXX='g++ -std=gnu++0x'
(В ответ на комментарий №4) > Встроенный тип char16_t доступен только при компиляции в режиме C++0x (g++ > -std=c++0x и g++ -std=gnu++0x). Если этот тип появляется только при определённых условиях, то разумеется необходимо из воспроизводить при сборке. Можно конечно для страждущих добавить эту опцию в в pkg-файлы, но это мягко говоря ...