Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ASIO вечно недоволен... не компилит libTorrent
Форум на CrossPlatform.RU > Библиотеки > boost
Lestat
ASIO ругается такой вот ошибкой... очень часто
c:\lib\boost\boost_1_35_0\boost\asio\detail\socket_types.hpp(27) : fatal error C1189: #error :  WinSock.h has already been included
я каким-то макаром ее обходил, но теперь хочу разобраться почему она меня преследует...

компилю пример работы с libTorrent
#include <iostream>
#include <fstream>
#include <iterator>
#include <exception>

#include <boost/format.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/session.hpp"

int main(int argc, char* argv[])
{
        using namespace libtorrent;
#if BOOST_VERSION < 103400
        namespace fs = boost::filesystem;
        fs::path::default_name_check(fs::no_check);
#endif

        if (argc != 2)
        {
                std::cerr << "usage: ./simple_client torrent-file\n"
                        "to stop the client, press return.\n";
                return 1;
        }

        try
        {
                session s;
                s.listen_on(std::make_pair(6881, 6889));

                std::ifstream in(argv[1], std::ios_base::binary);
                in.unsetf(std::ios_base::skipws);
                entry e = bdecode(std::istream_iterator<char>(in), std::istream_iterator<char>());
                s.add_torrent(torrent_info(e), "./");

                // wait for the user to end
                char a;
                std::cin.unsetf(std::ios_base::skipws);
                std::cin >> a;
        }
        catch (std::exception& e)
        {
                std::cout << e.what() << "\n";
        }
        return 0;
}
код взял отсюда
неужели у автора тоже была ошибка и он выложил заведомо кривой пример... что-то я сомневаюсь.
Могу предположить что у меня кривой ASIO
но я компилил на этих же инклудах примеры самого асио, некоторые свои исходники... все работает, хотя затык такой всегда был.
обходил шаманством с инклудами... помогите, пожалуйста, определить в чем проблема!
Спасибо!
Litkevich Yuriy
Цитата(Lestat @ 7.10.2008, 23:08) *
WinSock.h has already been included
такое ощущение что гдето в заголовочниках забыты строки:
#ifndef CLASS_H
#define CLASS_H
...
#endif //CLASS_H


Цитата(Lestat @ 7.10.2008, 23:08) *
обходил шаманством с инклудами...
а что конкретно делал?
Tonal
А если честно попробовать включить WinSock.h до заголовков libTorrent-а?
Lestat
Litkevich Yuriy, у меня в проекте было много заголовочных файлов и я фактически подключал их так чтобы этой ошибки не было...
ошибка я так понимаю вылетает когда уже засветился где-то выше #define WIN32
а он в windows.h есть, в файлах boost'а для работы с date-time
Tonal, я такие эксперименты раньше делал... и так, и сяк, а оно не работает... это ошибка - единственное серьезное неудобство с которым я сталкивался на данный момент
по всяким там функциям, классам, и т.д. примеры есть, а когда начинаю собирать в одном проекте (юзал wxWidgets, boost вместе с asio, OpenGL, Pango еще некоторая сопроводиловка), то не всегда компилится нормально
У меня практически всегда ASIO начинает ругаться на WinSock.h при некоторых неосторожных изменениях в инклудах)

пока можно выкрутится если вписать #define WIN32_LEAN_AND_MEAN перед включением всех файлов
прямо перед
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <fstream>

у меня даже скомпилить получилось, только теперь либы нужны самого libtorrent
пытался собрать сам какую-нить libtorrent.lib, но нашел вот это опенсорсное на основе libtorrent LiberTV
Вот ТУТ полезная статья. В ней можно найти ссылку на LiberTV SDK (82.7 MB) там либы буста, DirectX 9 SDK и Windows Media Player 10 SDK.
Я так понимаю там собрали все что нужно для компиляции исходников.
Попробую оттуда повыдирать все что нужно для компиляции libtorrent'а
Andrew Selivanov
Цитата(Lestat @ 7.10.2008, 22:18) *
Litkevich Yuriy, у меня в проекте было много заголовочных файлов и я фактически подключал их так чтобы этой ошибки не было...
ошибка я так понимаю вылетает когда уже засветился где-то выше #define WIN32
а он в windows.h есть, в файлах boost'а для работы с date-time
Tonal, я такие эксперименты раньше делал... и так, и сяк, а оно не работает... это ошибка - единственное серьезное неудобство с которым я сталкивался на данный момент
по всяким там функциям, классам, и т.д. примеры есть, а когда начинаю собирать в одном проекте (юзал wxWidgets, boost вместе с asio, OpenGL, Pango еще некоторая сопроводиловка), то не всегда компилится нормально
У меня практически всегда ASIO начинает ругаться на WinSock.h при некоторых неосторожных изменениях в инклудах)

пока можно выкрутится если вписать #define WIN32_LEAN_AND_MEAN перед включением всех файлов
прямо перед
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <fstream>

у меня даже скомпилить получилось, только теперь либы нужны самого libtorrent
пытался собрать сам какую-нить libtorrent.lib, но нашел вот это опенсорсное на основе libtorrent LiberTV
Вот ТУТ полезная статья. В ней можно найти ссылку на LiberTV SDK (82.7 MB) там либы буста, DirectX 9 SDK и Windows Media Player 10 SDK.
Я так понимаю там собрали все что нужно для компиляции исходников.
Попробую оттуда повыдирать все что нужно для компиляции libtorrent'а


Ну епрст, все же написано C:\boost\boost_1_35_0\boost\asio\detail\socket_types.hpp
# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
# error WinSock.h has already been included
# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)

winsock2.h из MSVS 8.0
#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
//...
#endif /* _WINSOCK2API_ */

Вывод: использовать то, что просят (winsock2, и либы mswsock, ws2_32)
Lestat
Проблема решилась, проблем больше нет!
Скомпилилась либа, собрался проект! :D
простейший торрент килент! качалка заработала
Но гимора я охатил прилично...
В исходнике, чтобы не было всяких fatal error C1189: #error : WinSock.h has already been included
нужно подключить #include "libtorrent/pch.hpp" до подключения #include "libtorrent/entry.hpp"
у меня покрайней мере так сработало...
для проекта необходимо собрать либу libtorrent.lib... с этим я тоже намучался
Выдрал проект либы из исходников опенсорсного клиента Halite
Либу получил, но при компилировании проекта на ее основе были ошибки... начал менять настройки проекта либы
Когда поставил поставил в настройках проекта Not Set в General->Character set и Multi-threaded Debug (/MTd) в C/C++->Code Ceneration->Runtime Library все стало работать как надо
Вобще я так понял если есть ошибки при линковке проекта(не либы, а самого торрент-клиента), то возможно ошибка как раз в том что либу не так собрали... в этих настройках
Я юзаю в пректе еще boost, wxWidgets, еще несколько либ и только при таких настройках компиляции либы проект соизволил собраться нормально.
Andrew Selivanov
Цитата(Lestat @ 19.10.2008, 22:33) *
Проблема решилась, проблем больше нет!
Скомпилилась либа, собрался проект! :D
простейший торрент килент! качалка заработала
Но гимора я охатил прилично...
В исходнике, чтобы не было всяких fatal error C1189: #error : WinSock.h has already been included
нужно подключить #include "libtorrent/pch.hpp" до подключения #include "libtorrent/entry.hpp"
у меня покрайней мере так сработало...
для проекта необходимо собрать либу libtorrent.lib... с этим я тоже намучался
Выдрал проект либы из исходников опенсорсного клиента Halite
Либу получил, но при компилировании проекта на ее основе были ошибки... начал менять настройки проекта либы
Когда поставил поставил в настройках проекта Not Set в General->Character set и Multi-threaded Debug (/MTd) в C/C++->Code Ceneration->Runtime Library все стало работать как надо
Вобще я так понял если есть ошибки при линковке проекта(не либы, а самого торрент-клиента), то возможно ошибка как раз в том что либу не так собрали... в этих настройках
Я юзаю в пректе еще boost, wxWidgets, еще несколько либ и только при таких настройках компиляции либы проект соизволил собраться нормально.

Поздравления :)

ЗЫ: намучался как то ставить видеоплеер в старый redhat... для того, чтобы его поставить надо было пересобрать glibc, собрать из исходников rpm, переставить его...,...,...,... просто сказка. Ушло две недели, как щаз помню. А результирующая бумажка с тем, как это делается, напоминает прохождение длинного квеста :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.