Russian Qt Forum
Ноябрь 24, 2024, 07:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибки линковки  (Прочитано 10498 раз)
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. Сервер запущен.
« Последнее редактирование: Май 17, 2016, 10:07 от Myafka » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Апрель 27, 2016, 08:16 »

Ответ вроде здесь есть https://thrift.apache.org/docs/install/windows Linking to installed C++ runtime libraries.

На самом деле необходимо исследовать вопрос, как собран thrift (какие DEFIDES заданы). Для ликовки в Windows необходимо, чтобы класс был собран в виде

Код
C++ (Qt)
class __declspec(dllexport) Class
{
   ...
};
 

Обычно классы в библиотеках оформляют, как

Код
C++ (Qt)
class EXPORT_MACROS Class
{
   ...
};
 
где значение EXPORT_MACROS определяется режимом сборки.

Если ничего такого нет, то библиотеки можно (нужно) собрать в статическом виде.
Записан
vrastrigin
Гость
« Ответ #2 : Апрель 28, 2016, 11:17 »

По ссылке описано, как вручную слинковать четыре object-файла, но в моём случае после сборки библиотек два из четырёх файла отсутствуют:
- Thrift.obj
- TBinaryProtocol.obj

Ошибки такие же.

P.S.:
Смотрел исходники C++ thrift-библиотек и не нашёл в них особенного оформления: создаются обычные классы.
Библиотеки по умолчанию собираются в статическом виде и создаются .lib-файлы.
(Для сборки библиотек использую: Visual Studio 2013).
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Апрель 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 в сборке участвуют?
Записан
vrastrigin
Гость
« Ответ #4 : Апрель 29, 2016, 14:14 »

Нет, не все:
например, класс TProtocol: для него присутствует только объявление в заголовочном файле "thrift\protocol\TProtocol.h", файл с реализацией, TProtocol.cpp - просто отсутствует в исходниках.
Записан
nwnclv
Гость
« Ответ #5 : Май 04, 2016, 21:27 »

Цитировать
файл с реализацией, TProtocol.cpp - просто отсутствует в исходниках.

неправда

lib/cpp/src/thrift/protocol$ cat TProtocol.cpp
Код
C++ (Qt)
 
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

 
#include <thrift/protocol/TProtocol.h>
 
namespace apache {
namespace thrift {
namespace protocol {
 
TProtocol::~TProtocol() {}
uint32_t TProtocol::skip_virt(TType type) {
 return ::apache::thrift::protocol::skip(*this, type);
}
 
TProtocolFactory::~TProtocolFactory() {}
 
}}} // apache::thrift::protocol
 
 

все остальное тоже есть.
Записан
vrastrigin
Гость
« Ответ #6 : Май 05, 2016, 11:09 »

неправда
...
все остальное тоже есть.

Какую версию исходников thrift Вы смотрите? 0.9.2 или 0.9.3? Я использовал 0.9.2 (поскольку 0.9.3 выложена без файла thrift.cpp).
Вы используете C++ версию thrift? Если да, то не могли бы Вы пошагово описать процесс создания простейшего примера сервера+клиента с одним реально работающим методом?
Записан
nwnclv
Гость
« Ответ #7 : Май 06, 2016, 02:27 »

смотрел версию 0.9.3
У нас с ней еще что-то собирается, что еще не перенесли. И, на сколько я знаю, успешно (винда и линукс).

А вообще мы в свое время отказались от cрифта, я свою либу RPC навелосипедил с колбеками и рекурсей

Цитировать
процесс создания простейшего примера сервера+клиента с одним реально работающим методом?

Да, у нас пользовался для С++

И у него ж в доках простой пример есть. https://github.com/apache/thrift/tree/master/tutorial/cpp не работает?

Могу попробовать на выходных упороться и собрать, если время будет. Только у меня винды нет девелоперской, linux есть.
Записан
vrastrigin
Гость
« Ответ #8 : Май 10, 2016, 09:22 »

И у него ж в доках простой пример есть. https://github.com/apache/thrift/tree/master/tutorial/cpp не работает?
Могу попробовать на выходных упороться и собрать, если время будет. Только у меня винды нет девелоперской, linux есть.
Да, не получается. Заранее спасибо!
Записан
nwnclv
Гость
« Ответ #9 : Май 13, 2016, 21:23 »

Да, не получается. Заранее спасибо!

В общем-то как и ожидалось, с линуксом никаких проблем нет. Скомпилировалось и работает без проблем.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Май 13, 2016, 21:54 »

Не хочу быть занудой, но тема должна называться "Ошибки линковки"
Записан
vrastrigin
Гость
« Ответ #11 : Май 14, 2016, 08:53 »

В общем-то как и ожидалось, с линуксом никаких проблем нет. Скомпилировалось и работает без проблем.
Значит дело в самом процессе сборки? Если следовать вот этой Инструкции - то пример калькулятора из архива 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)
Записан
nwnclv
Гость
« Ответ #12 : Май 14, 2016, 20:10 »

Значит дело в самом процессе сборки? Если следовать вот этой Инструкции

[offtopic]
Капец как у них все сложно.
[/offtopic]

Кстати ты буст и всякие другие либы нужной версии подкладываешь? А то там гляжу для 14 версии собраны, и если 13  студией их линковать -- не выйдет каменный цветок.
Записан
vrastrigin
Гость
« Ответ #13 : Май 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 - я даже не собираю, а скачиваю готовые бинарники для соответствующей версии студии.
Так что цветочек должен получиться отменный.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.