Название: Ошибки линковки Отправлено: Myafka от Апрель 26, 2016, 09:25 Всем привет!
Пытаюсь создать клиент по примеру - https://thrift.apache.org/tutorial/cpp. Возникает несколько ошибок: - main.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual __thiscall apache::thrift::protocol::TProtocol::~TProtocol(void)" (??1TProtocol@protocol@thrift@apache@@UAE@XZ)" - main.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual unsigned int __thiscall apache::thrift::protocol::TProtocol::skip_virt(enum apache::thrift::protocol::TType)" (?skip_virt@TProtocol@protocol@thrift@apache@@UAEIW4TType@234@@Z)" - libthrift.lib(TSocket.obj):-1: ошибка: LNK2001: неразрешенный внешний символ ""class apache::thrift::TOutput apache::thrift::GlobalOutput" (?GlobalOutput@thrift@apache@@3VTOutput@12@A)" - libthrift.lib(TSocket.obj):-1: ошибка: LNK2001: неразрешенный внешний символ ""public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl apache::thrift::TOutput::strerror_s(int)" (?strerror_s@TOutput@thrift@apache@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)" - libthrift.lib(TSocket.obj):-1: ошибка: LNK2001: неразрешенный внешний символ ""public: void __thiscall apache::thrift::TOutput::perror(char const *,int)" (?perror@TOutput@thrift@apache@@QAEXPBDH@Z)" В файле .pro прописаны все папки к библиотекам INCLUDEPATH += ".../gen-cpp" INCLUDEPATH += ".../thrift" INCLUDEPATH += ".../boost" LIBS += -LC:/boost/stage/lib -llibboost_system-vc120-mt-gd-1_60 Прописаны пути к библиотекам трифта libthrift и libthriftnb: LIBS += -LC:/Thrift/thrift-0.9.3/thrift-0.9.3/lib/cpp/Release -llibthriftnb LIBS += -LC:/Thrift/thrift-0.9.3/thrift-0.9.3/lib/cpp/Release -llibthrift Библиотеки собраны компилятором MSVC. Клиент собираю тоже MSVC. Сервер запущен. Название: Re: Ошибки компиляции Отправлено: ssoft от Апрель 27, 2016, 08:16 Ответ вроде здесь есть https://thrift.apache.org/docs/install/windows (https://thrift.apache.org/docs/install/windows) Linking to installed C++ runtime libraries.
На самом деле необходимо исследовать вопрос, как собран thrift (какие DEFIDES заданы). Для ликовки в Windows необходимо, чтобы класс был собран в виде Код
Обычно классы в библиотеках оформляют, как Код где значение EXPORT_MACROS определяется режимом сборки. Если ничего такого нет, то библиотеки можно (нужно) собрать в статическом виде. Название: Re: Ошибки компиляции Отправлено: vrastrigin от Апрель 28, 2016, 11:17 По ссылке описано, как вручную слинковать четыре object-файла, но в моём случае после сборки библиотек два из четырёх файла отсутствуют:
- Thrift.obj - TBinaryProtocol.obj Ошибки такие же. P.S.: Смотрел исходники C++ thrift-библиотек и не нашёл в них особенного оформления: создаются обычные классы. Библиотеки по умолчанию собираются в статическом виде и создаются .lib-файлы. (Для сборки библиотек использую: Visual Studio 2013). Название: Re: Ошибки компиляции Отправлено: ssoft от Апрель 28, 2016, 13:09 ... два из четырёх файла отсутствуют: P.S.: Смотрел исходники C++ thrift-библиотек и не нашёл в них особенного оформления ... Так для методов, которые не ликуются, есть реализация? - apache::thrift::protocol::TProtocol::~TProtocol(void) - apache::thrift::protocol::TProtocol::skip_virt(enum apache::thrift::protocol::TType) и т.д. И все ли исходники thrift в сборке участвуют? Название: Re: Ошибки компиляции Отправлено: vrastrigin от Апрель 29, 2016, 14:14 Нет, не все:
например, класс TProtocol: для него присутствует только объявление в заголовочном файле "thrift\protocol\TProtocol.h", файл с реализацией, TProtocol.cpp - просто отсутствует в исходниках. Название: Re: Ошибки компиляции Отправлено: nwnclv от Май 04, 2016, 21:27 Цитировать файл с реализацией, TProtocol.cpp - просто отсутствует в исходниках. неправда lib/cpp/src/thrift/protocol$ cat TProtocol.cpp Код
все остальное тоже есть. Название: Re: Ошибки компиляции Отправлено: vrastrigin от Май 05, 2016, 11:09 неправда ... все остальное тоже есть. Какую версию исходников thrift Вы смотрите? 0.9.2 или 0.9.3? Я использовал 0.9.2 (поскольку 0.9.3 выложена без файла thrift.cpp). Вы используете C++ версию thrift? Если да, то не могли бы Вы пошагово описать процесс создания простейшего примера сервера+клиента с одним реально работающим методом? Название: Re: Ошибки компиляции Отправлено: nwnclv от Май 06, 2016, 02:27 смотрел версию 0.9.3
У нас с ней еще что-то собирается, что еще не перенесли. И, на сколько я знаю, успешно (винда и линукс). А вообще мы в свое время отказались от cрифта, я свою либу RPC навелосипедил с колбеками и рекурсей Цитировать процесс создания простейшего примера сервера+клиента с одним реально работающим методом? Да, у нас пользовался для С++ И у него ж в доках простой пример есть. https://github.com/apache/thrift/tree/master/tutorial/cpp не работает? Могу попробовать на выходных упороться и собрать, если время будет. Только у меня винды нет девелоперской, linux есть. Название: Re: Ошибки компиляции Отправлено: vrastrigin от Май 10, 2016, 09:22 И у него ж в доках простой пример есть. https://github.com/apache/thrift/tree/master/tutorial/cpp не работает? Да, не получается. Заранее спасибо!Могу попробовать на выходных упороться и собрать, если время будет. Только у меня винды нет девелоперской, linux есть. Название: Re: Ошибки компиляции Отправлено: nwnclv от Май 13, 2016, 21:23 Да, не получается. Заранее спасибо! В общем-то как и ожидалось, с линуксом никаких проблем нет. Скомпилировалось и работает без проблем. Название: Re: Ошибки компиляции Отправлено: __Heaven__ от Май 13, 2016, 21:54 Не хочу быть занудой, но тема должна называться "Ошибки линковки"
Название: Re: Ошибки компиляции Отправлено: vrastrigin от Май 14, 2016, 08:53 В общем-то как и ожидалось, с линуксом никаких проблем нет. Скомпилировалось и работает без проблем. Значит дело в самом процессе сборки? Если следовать вот этой Инструкции (http://mohamednadjibmami.com/apache-thrift-for-c-on-visual-studio-2015/) - то пример калькулятора из архива thrift версии 0.9.2 на С++ собирается и работает (сервер запускается, клиент подключается и выдает результат)Visual Studio 2013 + Apache Thrift 0.9.2 + Boost 1.59.0 + Libevent 2.0.22 + OpenSSL 1.0.2h Но вот если использовать Apache Thrift 0.9.3, то при сборке примера сервера\клиента возникает множество ошибок линковки (порядка 70-90) Название: Re: Ошибки компиляции Отправлено: nwnclv от Май 14, 2016, 20:10 Значит дело в самом процессе сборки? Если следовать вот этой Инструкции (http://mohamednadjibmami.com/apache-thrift-for-c-on-visual-studio-2015/) [offtopic] Капец как у них все сложно. [/offtopic] Кстати ты буст и всякие другие либы нужной версии подкладываешь? А то там гляжу для 14 версии собраны, и если 13 студией их линковать -- не выйдет каменный цветок. Название: Re: Ошибки линковки Отправлено: vrastrigin от Май 18, 2016, 09:49 Есть два варианта: Visual Studio 2013 (для либ - это версия 12) и Visual Studio 2015 (для либ - это версия 14).
Автор поста с инструкцией в послесловии указал, что инструкция протестирована как на VS2015, так и на VS2013; точно также я и сам проверил, что эта инструкция работает на VS2013, если использовать thrift 0.9.2 (предпоследний на сегодня). Библиотеки: - libevent - собираю с помощью nmake, здесь не должно быть проблем; - openssl - использую как есть и тоже не зависят от версии студии; - thrift - разрабатывается в VS2010 (для либ - это версия 10), но в любой инструкции есть пункт, что нужно преобразовать проект в вашу версию студии, собирается успешно; - boost - я даже не собираю, а скачиваю готовые бинарники для соответствующей версии студии. Так что цветочек должен получиться отменный. |