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

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

14.02.2018, 17:43. Показов 4010. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru