LINUX.ORG.RU

Zeroc ICE ссылается на классы, которых нет в библиотеках

 


0

1

Пытаюсь собрать самостоятельно библиотеку Zeroc ICE версии 3.6.4. Перехожу в cpp каталог, делаю make и, доустановив то что не хватало, всё наконец собирается. Появляются libIce.so.3.6.4 и libIceUtil.so.3.6.4, указываю includepath, указываю libs. У меня gcc version 4.8.4.

Однако собрать свою программу в итоге не выходит. Сам процесс компиляции проходит успешно, но валится на undefined reference to `IceInternal::Cpp11FnCallbackNC::Cpp11FnCallbackNC и прочих подобных.

Стал выяснять - этих функций и этих классов тупо нет в so-файлах. Само их объявление появляется в таких блоках:

#ifdef ICE_CPP11
::Ice::AsyncResultPtr
IceProxy::IceMX::MetricsAdmin::__begin_getMetricsViewNames(const ::Ice::Context* __ctx, const ::IceInternal::Function<void (const ::Ice::StringSeq&, const ::Ice::StringSeq&)>& __response, const ::IceInternal::Function<void (const ::Ice::Exception&)>& __exception, const ::IceInternal::Function<void (bool)>& __sent)
{
    class Cpp11CB : public ::IceInternal::Cpp11FnCallbackNC

Стал смотреть - в файле Config.h библиотеки есть такой участок:

#if (__cplusplus >= 201103) || \
    ((defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && ((__GNUC__* 100) + __GNUC_MINOR__) >= 405)) || \
    (defined(_MSC_VER) && (_MSC_VER >= 1600))
#   define ICE_CPP11
#endif
Получается, что оно, увидев что компилятор больше чем GCC 4.5 (а у меня gcc version 4.8.4), пытается сувать какие-то куски кода, которых в итоге я и не вижу нигде.

Как побороть эту проблему? Не понимаю, при сборке ни разу ни пикнуло об варнингах, не то что ошибках.

Я даже явно пробовал подсовывать все файлы и каталоги:

CONFIG += c++11
QMAKE_CXXFLAGS+="-std=c++11"
INCLUDEPATH += /home/user/work/w/ice-3.6.4/cpp/include
LIBS += -L/home/user/work/w/ice-3.6.4/cpp/lib/x86_64-linux-gnu -l:libIce.so.3.6.4 -l:libIceUtil.so.3.6.4

Ответ на: комментарий от anonymous

что это? уже нельзя, уже проект сделан на этом ICE, просто возникла необходимость сделать сборку библиотеки самостоятельно

I-Love-Microsoft ★★★★★ ()

День бился, удалось решить. Причина в том, что авторы библиотеки Zeroc ICE дебилоиды, врубали C++11 режим на основании версии компилятора (дефайн в шапке темы). А что если пользователь собрал библиотеку без этого режима, как по-дефолту???

Короче, если раскомментировать в ice-3.6.4/cpp/config/Make.rules строку «CPP11 ?= yes» то появляются версии библиотек с добавкой ++11 в их имени. И тогда всё собирается и работает.

И кстати, так как *.a файлов оно не выкакивает, то приходится линковаться таким образом...

CONFIG += c++11
INCLUDEPATH += /home/user/work/w/ice-3.6.4/cpp/include
LIBS += -L/home/user/work/w/ice-3.6.4/cpp/lib/x86_64-linux-gnu
LIBS += -l:libIce++11.so.3.6.4 -l:libIceUtil++11.so.3.6.4
С явным указанием имени файла.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Не рекомендую завязываться на фичи C++11 (в понимании ZeroC) в связке с Ice 3.6. Дело в том, что в 3.7 они разделили биндинги для C++98 и C++11 и из биндинга для C++98 выкинули IceUtil::Function.

Begemoth ★★★★★ ()
Ответ на: комментарий от Begemoth

Да, я вижу что они разделили в 3.7. Только вот сборка без этой опции вообще не позволяет мне пользоваться этой библиотекой, либо я делаю что-то не так, я пока нуб в этой теме, но оно тупо тащит ++11 фичи даже для сборок без оной настройки.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.