Re[6]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 14:25
Оценка:
R>правильную lib укажите (скорее всего *core.lib)

Спасибо за советы,
оказалось, что я был не прав. Есть DLL-ки.
Просто они кладутся при сборке совсем не в тот же каталог, в который кладутся либы — и я их просто сначала не заметил.

Теперь программа собирается и запускается,
ошибка при запуске изменилась:

  программа
#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[] = "192.168.10.53";
        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:\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.
Re[7]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 14:30
Оценка:
если подключить *core.lib
то длл не нужны
но в любом случае вы выбрали не тот путь для изучения программирования
лучше начать с простых книжных примеров и ютуба
Re[8]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 14:33
Оценка:
Здравствуйте, reversecode, Вы писали:


R>если подключить *core.lib

R>то длл не нужны
R>но в любом случае вы выбрали не тот путь для изучения программирования
R>лучше начать с простых книжных примеров и ютуба

Как это сделать?
я имею в виду — подключить к проекту?
Re[9]: libevent: как её прилинковать к проекту под Windows?
От: wl. Россия  
Дата: 14.02.18 14:42
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

R>>если подключить *core.lib

R>>то длл не нужны
R>>но в любом случае вы выбрали не тот путь для изучения программирования
R>>лучше начать с простых книжных примеров и ютуба

SLH>Как это сделать?

SLH>я имею в виду — подключить к проекту?

можно прямо в исходном коде прописать что-то типа:

#pragma comment(lib, "OtherLib700.lib")


пути к либе должны быть прописаны в настройках
Re[9]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 14:44
Оценка:
http://rsdn.org/forum/cpp.applied/7054980.1
Автор: reversecode
Дата: 14.02.18

а вообще бросайте вы это программирования
это не ваше призвание
Re[10]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 15:12
Оценка:
SLH>>Как это сделать?
SLH>>я имею в виду — подключить к проекту?

wl.>можно прямо в исходном коде прописать что-то типа:


wl.>
wl.>#pragma comment(lib, "OtherLib700.lib")
wl.>


wl.>пути к либе должны быть прописаны в настройках


Очень интересно.
я никогда такого не встречал, но попробовал:
  картинка
http://junecat.ru/Storage/oth/le_pic10.jpg

И я убрал эти DLL из вот этого места:
  откуда я их убрал
http://junecat.ru/Storage/oth/le_pic5.jpg

Проект собирается, но при запуске я получаю
---------------------------
LibeEx1.exe - System Error
---------------------------
The code execution cannot proceed because event.dll was not found. Reinstalling the program may fix this problem. 
---------------------------
OK   
---------------------------

ТО есть, оно по прежнему пытается динамически линковать эти библиотеки.
я тут задумался — может, должно быть 2 версии библиотек, отдельно для статической и отдельно для динамической линковки?
Re: libevent: как её прилинковать к проекту под Windows?
От: niXman Ниоткуда https://github.com/niXman
Дата: 14.02.18 15:14
Оценка:
нужна имено MSVS?
если нет — под венду втавите MSYS2, и все будет так же просто, как в линуксе.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 15:15
Оценка:
Здравствуйте, niXman, Вы писали:

X>нужна имено MSVS?

X>если нет — под венду втавите MSYS2, и все будет так же просто, как в линуксе.
Да, нужна именно MSVC
Re[3]: libevent: как её прилинковать к проекту под Windows?
От: niXman Ниоткуда https://github.com/niXman
Дата: 14.02.18 15:18
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>Да, нужна именно MSVC


не завидую...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: libevent: как её прилинковать к проекту под Windows?
От: Mr.Delphist  
Дата: 14.02.18 15:48
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>Теперь программа собирается и запускается,

SLH>ошибка при запуске изменилась:

SLH>
SLH>C:\MyProjects\Cpp\LibeEx1\Debug>LibeEx1.exe
SLH>[warn] evsig_init_: socketpair: Either the application has not called WSAStartup, or WSAStartup failed.
SLH>Libevent initialised!
SLH>[warn] socket: Either the application has not called WSAStartup, or WSAStartup failed.
SLH>Failed to init http server.
SLH>


Ну, собственно похоже на то, что WinSock не инициализирован. Почитайте про WSAStartup
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms742213(v=vs.85).aspx
Re[8]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 15:58
Оценка:
MD>Ну, собственно похоже на то, что WinSock не инициализирован. Почитайте про WSAStartup
MD>https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms742213(v=vs.85).aspx

Взял руководство отсюда citforum.ru/book/cook/winsock.shtml Попробовал, но ошибка не изменилась.
Думаю, что дёрнуть винсок руками из моей программы — не решение, ведь его должна "дёрнуть" библиотека, которую я пытаюсь прилинковать к своему проекту.
К ней винсок2 уже по любому должен быть прилинкован, иначе бы она не собралась.

Я прошел в дебаге до той строки, в которой программа не может создать сокет. На картинке видно, какие значения имели переменные в момент, когда сокет не смог создаться. Посмотрите, может, в чем то понятном дело?
Отредактировано 14.02.2018 15:59 SteeLHeaD . Предыдущая версия .
Re[10]: libevent: как её прилинковать к проекту под Windows?
От: kov_serg Россия  
Дата: 14.02.18 16:01
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:


SLH>и выдаёт сообющение об ошибке


SLH>
SLH>C:\MyProjects\Cpp\LibeEx1\Debug>LibeEx1.exe
SLH>[warn] evsig_init_: socketpair: Either the application has not called WSAStartup, or WSAStartup failed.
SLH>Libevent initialised!
SLH>[warn] socket: Either the application has not called WSAStartup, or WSAStartup failed.
SLH>Failed to init http server.
SLH>


А если насильно вызвать WSAStartup
#include <winsock2.h>
#include <ws2tcpip.h>

int net_init() {
    WSADATA data;
    return WSAStartup(MAKEWORD(2,2), &data);
}
void net_done() {
    WSACleanup();
}
Re[9]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 16:04
Оценка: +1

https://github.com/libevent/libevent/blob/master/sample/http-server.c#L339
там даже примеры есть
ну бросьте вы это, зачем себя насиловать если не можете в самой библиотеке разобраться ?
Re[10]: libevent: как её прилинковать к проекту под Windows?
От: Слава  
Дата: 14.02.18 16:41
Оценка: -1
Здравствуйте, reversecode, Вы писали:

R>https://github.com/libevent/libevent/blob/master/sample/http-server.c#L339

R>там даже примеры есть
R>ну бросьте вы это, зачем себя насиловать если не можете в самой библиотеке разобраться ?

Примеры какие, для VS? То, на что вы дали ссылку — зачем-то кроссплатформенное в лучшем стиле — через прости господи ifdef'ы, и вдобавок — на Си. Я, если я захочу прочитать такой пример, не буду иметь желания любоваться на линуксовенькие артефакты, тем более что VS не сможет сделать сборку проекта под линукс (а под какой из их множества, кстати?) без особых усилий.

dirlen = strlen(whole_path);
pattern = malloc(dirlen+3);
memcpy(pattern, whole_path, dirlen);


Шли годы, бородатые свитерки продолжали писать код для срыва стека и кучи.
Re[10]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 16:47
Оценка:
Здравствуйте, reversecode, Вы писали:


R>

R>https://github.com/libevent/libevent/blob/master/sample/http-server.c#L339
R>там даже примеры есть
R>ну бросьте вы это, зачем себя насиловать если не можете в самой библиотеке разобраться ?

Примеров везде дофига.
я ж сказал — у мня на линукс это заработало за 15 мин.
Но отлаживаться мне надо под виндой.
Если, конечно, MS И дальше будет таким же открытым и современным — возможно, появится версия "студии" под линукс, но пока её нет.
И даже связываться с полушаманскими методиками отладки под линуксом из под винды типа
https://habrahabr.ru/company/microsoft/blog/319962/
мне не очень хочется.
А зачем мне разбираться в библиотеке?
Мне её надо правильно вызвать, и всё.
Как устроен HTTP — я знаю.
Мне нужна еккая штука, которая позволит мне удаленно дёргать серверную часть через сеть.
Потом мне нужен будет json — парсер.
И все, стек технологий для работы — готов.
Просто я этот стек на C++ ни разу не запускал.

А вот вы, при всём Вашем опыте, не можете мне подсказать, что надо сделать, чтобы проект собрался и заработал.
Re[11]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 16:51
Оценка: +1
ко мне какие претензии ? это официальные примеры libevent
того как ОНИ это используют, т.е. подсказываю, никаких Init функций которые должны инициализировать WSA* у них нет
и прежде чем браться за какую то либу, нужно читать и смотреть документацию и примеры, он для этого и пишутся
а не заниматься догадками
Re[11]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 16:54
Оценка:
в cmake есть запись про примеры, а значит эти примеры и под студией собираются

так пошлите подальше того кто вас этому заставил
пусть сам это делает
Re[11]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 16:56
Оценка:
]

_>А если насильно вызвать WSAStartup

_>
_>#include <winsock2.h>
_>#include <ws2tcpip.h>

_>int net_init() {
_>    WSADATA data;
_>    return WSAStartup(MAKEWORD(2,2), &data);
_>}
_>void net_done() {
_>    WSACleanup();
_>}
_>


Это работает.
net_init() возвращает код 0, что, как я понимаю, свидетельствует о нормальной работе.
Пробьлема закопана в вызове, который на "нижнем уровне" для создания HttpServer должен создать асинхронный сокет, а он его не создаёт.
Вот картинка того, что я вижу в дебаггере:

  дебаг где сокет не создаётся
Re[12]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 17:02
Оценка:
R>ко мне какие претензии ? это официальные примеры libevent
R>того как ОНИ это используют, т.е. подсказываю, никаких Init функций которые должны инициализировать WSA* у них нет
R>и прежде чем браться за какую то либу, нужно читать и смотреть документацию и примеры, он для этого и пишутся
R>а не заниматься догадками

У меня нет к Вам претензий.
Но я прочитал документацию.
конкретно — я прочитал вот это:
руководство по libevent на русском
В руководстве мне всё понятно.
Но там нигде нет главы "какие галочки поставить в среде разработки Visual Studio 2015, чтобы заработал хотя бы hello world".
Поэтому и приходится заниматься догадками.
Re: libevent: как её прилинковать к проекту под Windows?
От: niXman Ниоткуда https://github.com/niXman
Дата: 14.02.18 17:29
Оценка:
для каких целей вам понадобилась именно эта либа? может быть есть что-то другое, попроще, возможно, даже, хидер-онли...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.