С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51

Libevent: как её прилинковать к проекту под Windows?

14.02.2018, 17:43. Показов 4017. Ответов 5

Студворк — интернет-сервис помощи студентам
Господа,
у меня серьезный и важный вопрос, над которым я бьюсь головой об клавиатуру уже больше недели.
Я даже готов обсудить вознаграждение тому, кто мне поможет.
Вопрос такой: надо меня научить правильно ставить галочки в настройках линкера под VS 2015, чтобы у меня библиотека libevent линковалась к проекту на c++ (и, возможно, правильно билдить эту библиотеку).

Предыстория вопроса:
я прочитал пару мотивирующитъх статей насчет библиотеки libevent
(напрмер, эту: https://habrahabr.ru/post/217437/ ).
Начал я с того, что сделал девелоперскую машину под Ubuntu 16 LTS,
куда поставл g++ и собрал библиотеку из исходников по иструкциям с гитхаба.
( https://github.com/libevent/libevent )
Потом я написал простую программу test.cpp, в которой попробовал инициализировать библиотеку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <memory>
#include <cstdint>
#include <iostream>
#include <evhttp.h>
#include <string>
#include <fstream>
 
using namespace std;
 
int main(){
 
cout<< "Hi!" << endl ;
 
if ( !event_init()) 
  cout << "Failed to init libevent." << endl;
else
  cout << "libevent init successfully!" << endl;
 
 
return 0;
}
После небольшого замешательства я нормально собрал эту программу командой
g++ -std=c++11 -o test.ex test.cpp -levent
и запустил её.
./test.ex
Всё работает. Это пркрасно.
Затем я переписал из примеров немного более сложный пример...
Но как только я начал писать сам - мне понадобилась отладка.
И родная для меня система в этом смысле - Windows.
Ну, вы понимаете... родственников не выбирают...

А под Windows все совсем не так гладко.
Во первых, нужно собрать библиотеку из исходников.
По инструкции я делаю это при помощи CMake:
"CMake (Windows)
Install CMake: http://www.cmake.org

$ md build && cd build
$ cmake -G "Visual Studio 10" .. # Or whatever generator you want to use
$ start libevent.sln"

Cmake при сборке ругается на отсутствие OpenSSL, и тут уже не помогают никакие танцы с бубнами:
чтобы использовать OpenSSL под виндой, надо определить три магические переменные окружения
OPENSSL_ROOT_DIR
OPENSSL_INCLUDE_DIR
OPENSSL_CRYPTO_LIBRARY
а как эти переменные определять - не написано нигде.
К счастью, если закрыта дверь - можно проверить окно...
libevent позволяет собрать себя без поддержки OpenSSL, дописыванием ключика -DEVENT__DISABLE_OPENSSL=on,
то есть командой
cmake -DEVENT__DISABLE_OPENSSL=on -G "Visual Studio 14 2015"
Меня, правда, немного смущают некоторые предупреждения, которые написала мне эта команда,
её вывод видно здесь:


Но *.sln файл создаётся, и после запуска компиляции я получил набор *.lib - файлов в директории Debug:
event.lib, event_core.lib, event_extra.lib.



А вот потом начались проблемы.
Никакие пляски с бубном не позволяют мне прилинковать эти библиотеки к C++ проекту.
Для полноты картины:
в моей системе путь к этим *.lib файлам - это C:\Programs\includes\libevent\lib\Debug
я засобывал их сюда:



и сюда:



и сюда:



и даже сюда:



При последней попытке создалась иллюзия того, что что то получилось. то есть проект нормально собрался. Но при запуске я мгновенно получил ошибку:



Потом я сделал еще две жалкие попытки разобраться:
слинковать (потому что сборка obj-файла проходит без ошибок, заметьте) под виндой из командной строки (результат - тот же, не видит библиотеки)



и попробовать сравнить содержимой obj - файлов, воспользовавшись под линуксом утилитой nm, а под виндой - dumpbin с опцией /symbols
Но разница слишком велика, я просто вижу в виндовом объектном файле, что символ _event_init - UNDEFined.



В общем, я не достиг успеха.
Помогите, пожалуйста, например - подсказав, как определить магические переменные для OpenSSL (может, библиотека толькоприкинулась, что она нормально собрана?),
или попробовав у себя собрать этот проект с этой библиотекой - возможно, у вас получится.

Заранее спасибо за советы.

Добавлено через 2 часа 20 минут
Господа, у меня появились новые успехи: как выяснилось, у меня при сборке libevent создаются таки DLL-ки. Просто я их не сразу заметил. Сейчас я их копирую в тот же фолдер, где лежит EXEшник.
Сейчас у меня следующая стадия: программа

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        #include <memory>
        #include <cstdint>
        #include <iostream>
        #include <evhttp.h>
 
        using namespace std;
 
        int main()
        {
            if (!event_init()) {
                cout << "Failed to init libevent." << endl;
            }
            else {
 
                cout << "Libevent initialised!" << endl;
 
 
                char const SrvAddress[] = "127.0.0.1";
                uint16_t SrvPort = 5555;
                unique_ptr<evhttp, decltype(&evhttp_free)> Server(evhttp_start(SrvAddress, SrvPort), &evhttp_free);
                if (!Server)
                {
                    cout << "Failed to init http server." << std::endl;
                    return -1;
                }
                void(*OnReq)(evhttp_request *req, void *) = [](evhttp_request *req, void *)
                {
                    auto *OutBuf = evhttp_request_get_output_buffer(req);
                    if (!OutBuf)
                        return;
                    evbuffer_add_printf(OutBuf, "<html><body><center><h1>Hello World! under Windows!</h1></center></body></html>");
                    evhttp_send_reply(req, HTTP_OK, "", OutBuf);
                };
                evhttp_set_gencb(Server.get(), OnReq, nullptr);
                if (event_dispatch() == -1)
                {
                    cout << "Failed to run messahe loop." << std::endl;
                    return -1;
 
                }
            }
    
            return 0;
        }


собирается и запускается, а после запуска выдаёт ошибку

C++
1
2
3
4
5
C:\MyProjects\Cpp\LibeEx1\Debug>LibeEx1.exe
[warn] evsig_init_: socketpair: Either the application has not called WSAStartup, or WSAStartup failed.
Libevent initialised!
[warn] socket: Either the application has not called WSAStartup, or WSAStartup failed.
Failed to init http server.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2018, 17:43
Ответы с готовыми решениями:

Как прилинковать dll к проекту?
Пишу программу, но при тесте у других юзеров выяснилось, что для запуска программы требуется sqlite3.dll. Как мне прилинковать её чтобы она...

Как подключить System.Windows.Forms.dll к проекту
Здравствуйте! Можно ли подключить библиотеки .net к проекту. Если да, то как? Заранее благодарю!

Как подключить пространство имен Windows::Media::Capture к проекту?
Хочу попробовать использовать в проекте WinForms API-функцию CamCaptureUI. Возможно ли это ? Если да,то как подключить namespace ...

5
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
14.02.2018, 18:39
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Either the application has not called WSAStartup, or WSAStartup failed.
в функции main() нужно первым делом вызвать WSAStartup. Например, так:
C
1
2
WSADATA WSAData;
WSAStartup (MAKEWORD(2,2), &WSAData);
Добавлено через 4 минуты
не забудьте подключить библиотеку
C
1
#pragma comment(lib, "ws2_32.lib")
0
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
14.02.2018, 20:05  [ТС]
Спасибо,
это был бы хороший ответ, если бы я использовал windows sockets
Но я то использую более высокоуровневую библиотеку.
Все вопросы с тем, что надо сделать с винсокетами, она берёт на себя.
Мне этого в коде делать уже не надо.
У меня есть конкретное место уже в коде библиотеки,
где сокет созаваться должен, но не создаётся:
Кликните здесь для просмотра всего текста


А вот почему он не создаётся :-) - уже непонятно.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
14.02.2018, 20:30
Лучший ответ Сообщение было отмечено SteeLHeaD как решение

Решение

Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Но я то использую более высокоуровневую библиотеку.
Все вопросы с тем, что надо сделать с винсокетами, она берёт на себя.
Мне этого в коде делать уже не надо.
Глядите пример libevent/sample/hello-world.c - нужно вызывать.
1
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
15.02.2018, 04:15  [ТС]
Приветсвую!
Большое спасибо за подсказку!
"Глядите пример libevent/sample/hello-world.c - нужно вызывать."
Точно...
Большое спасибо!
Раз в 3-4 года наступаю на какие нибудь грабли winsock2, и этот секс с виндовс не кончается и не кончается!
Да, стал сравнивать, и в отдадчике нашел, в каком месте в одном случае инициализация происходит, а в другом - не происходит.
Оказалось, что под виндовс ДЕЙСТВИТЕЛЬНО надо в самом начале функции main написать
C++
1
2
3
4
#ifdef _WIN32
    WSADATA wsa_data;
    WSAStartup(0x0201, &wsa_data);
#endif
Как говорится, никогда не было, и вот опять!
Нет, это никогда не надоедает!
0
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
19.02.2018, 12:43  [ТС]
На тему моих приключений с WinSock я даже специально нарисовал демотиватор для молодых программистов:
(не могу разобраться, как тут вставить в текст картинку, поэтому Вам придётся нажать на ссылку)

http://junecat.ru/Storage/oth/... ivator.jpg
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2018, 12:43
Помогаю со студенческими работами здесь

Как прилинковать libgsl?
Добрый день. Сегодня полдня компилировал GNU Scientific Library под Cygwin в XP. В конце концов, получил таки libgsl.a. Подскажите...

как прилинковать к MS SQLServer 2005
Хочу прилинковать firebird к MS SQLServer 2005 (Firebird 1.5 Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37...

Как в gcc прилинковать библиотеку .a?
Как в gcc прилинковать библиотеку .a, например? Добавлено через 55 минут Если еще более конкретно, как указать путь до lib*.a? ...

Подскажите, как прилинковать Excel
Имеется таблица, содержащая поля: Организация, Город, Отрасль, E-mail. На главной форме есть поле со списком-Город, и кнопка, при нажатии...

Как правильно прилинковать сервер Аксесс
Добрый день! Не могу прилинковать сервер: файл аксесс 2003 с паролем на открытие файла. Использую SQL Server 2008 Express. Далаю так ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru