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

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

14.02.2018, 17:43. Показов 4042. Ответов 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,894
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,894
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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru