libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 12:46
Оценка:
Господа,
у меня серьезный и важный вопрос, над которым я бьюсь головой об клавиатуру уже больше недели.
Я даже готов обсудить вознаграждение тому, кто мне поможет.
Вопрос такой: надо меня научить правильно ставить галочки в настройках линкера под VS 2015, чтобы у меня библиотека libevent линковалась к проекту на c++ (и, возможно, правильно билдить эту библиотеку).

Предыстория вопроса:
я прочитал пару мотивирующитъх статей насчет библиотеки libevent
(напрмер, эту: https://habrahabr.ru/post/217437/ ).
Начал я с того, что сделал девелоперскую машину под Ubuntu 16 LTS,
куда поставл g++ и собрал библиотеку из исходников по иструкциям с гитхаба.
( https://github.com/libevent/libevent )
Потом я написал простую программу test.cpp, в которой попробовал инициализировать библиотеку:

#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"

Меня, правда, немного смущают некоторые предупреждения, которые написала мне эта команда,
её вывод видно здесь:
  Pic0

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

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


и сюда:
  Pic3


и сюда:
  Pic4


и даже сюда:
  Pic5



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


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


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


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

Заранее спасибо за советы.
libevent c++ visual studio linker openssl
Re: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 12:53
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>у меня серьезный и важный вопрос, над которым я бьюсь головой об клавиатуру уже больше недели.

А сами библиотеки линкуете?
Третий Рим должен пасть!
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 12:56
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, SteeLHeaD, Вы писали:


SLH>>у меня серьезный и важный вопрос, над которым я бьюсь головой об клавиатуру уже больше недели.

GC>А сами библиотеки линкуете?
Я имею в виду Linker -> Input -> Additional Dependencies ?
Там список *.lib файлов, котрые линкуются, туда добавте event.lib, или как там они называются?
Третий Рим должен пасть!
Re: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 12:57
Оценка: +1
что толку от library Directory если не указано какую либу линковать
Re[3]: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 13:05
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Там список *.lib файлов, котрые линкуются, туда добавте event.lib, или как там они называются?

Попробуйте все три линковать: event_core.lib, event_extra.lib, event.lib.

Еще, подозреваю там символа препроцессора нужно правильно устанавливать.
DLL файлов никаких не создалось после компиляции event? Поищите в той папке где вы event собирали, может какие-то DLL-ки завалялись?
Третий Рим должен пасть!
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:09
Оценка:
Здравствуйте, reversecode, Вы писали:


R>что толку от library Directory если не указано какую либу линковать

А нельзя ли ка то поподробне показать, какие там кнопки нажимать, чтобы указать либу?
Re[4]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:11
Оценка:
Здравствуйте, GhostCoders, Вы писали:
GC>DLL файлов никаких не создалось после компиляции event? Поищите в той папке где вы event собирали, может какие-то DLL-ки завалялись?
Нет, эта штука максимально кроссплатформенная и вообще DLL не создаёт.
Во всяком случае, как я понял из описаний.
И DLL — никакие не завалялись.
Re[3]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 13:15
Оценка:
в ютубе полно видео, ну ок
давайте я поищу за вас
https://youtu.be/F4mB2Atu6J4?t=344
Re[4]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:18
Оценка:
GC>>Там список *.lib файлов, котрые линкуются, туда добавте event.lib, или как там они называются?
GC>Попробуйте все три линковать: event_core.lib, event_extra.lib, event.lib.

Попробовал.
Ошибка при запуске — та же самая:
"---------------------------
LibeEx1.exe — System Error
---------------------------
The code execution cannot proceed because event.dll was not found. Reinstalling the program may fix this problem.
---------------------------
OK
---------------------------
"

Я думаю, дело здесь вот в чём: в этом месте, гдле указываются дополнительные зависимости,
можно вставлять только ДИНАМИЧЕСКИ подключаемые библиотеки.
Это — следствие того, что под виндой есть DLL-ки.
Но так как libevent не существует в виде DLL — значит, нужна какая то другая магия, чтобы линкер узнал о том, как слинковаться с этой библиотекой
Re[4]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:24
Оценка:
Здравствуйте, reversecode, Вы писали:


R>в ютубе полно видео, ну ок

R>давайте я поищу за вас
R>https://youtu.be/F4mB2Atu6J4?t=344

Спасибо,
я это делал и у меня это в исходном вопросе написано:
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
---------------------------
Думаю, что при это м линкер помечает ссылку в *.obj — файле как требующую динамического связывания
(то есть, как я понимаю, связывания при запуске программы) и в этом случае код из библиотеки даже не пытается вставиться в мой EXE шник
Re[4]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:27
Оценка:
GC>Еще, подозреваю там символа препроцессора нужно правильно устанавливать.
А что это такое и как этоделать?
Re[5]: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 13:32
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:


GC>>Еще, подозреваю там символа препроцессора нужно правильно устанавливать.

SLH>А что это такое и как этоделать?
Вкладка С\С++ -> Preprocessor -> Preprocessor Definitions
если DLL действительно нет (лучше поискать во всем подпапкам проекта) то символ будет в духе LIB_EVENT_USE_STATIC_LIB
А вообще лучше заголовочные файлы почитайте от libevent, event.h — там должно быть их использвание.
Третий Рим должен пасть!
Re[5]: libevent: как её прилинковать к проекту под Windows?
От: K13 http://akvis.com
Дата: 14.02.18 13:35
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>---------------------------

SLH>The code execution cannot proceed because event.dll was not found. Reinstalling the program may fix this problem.
SLH>---------------------------

Проблема четко указана: не найдена event.dll

SLH>Я думаю, дело здесь вот в чём: в этом месте, гдле указываются дополнительные зависимости,

SLH>можно вставлять только ДИНАМИЧЕСКИ подключаемые библиотеки.

Неправда. У вас просто либа собрана для динамической линковки, а .lib -- всего лишь переходник для загрузки .dll

SLH>Это — следствие того, что под виндой есть DLL-ки.

SLH>Но так как libevent не существует в виде DLL — значит, нужна какая то другая магия, чтобы линкер узнал о том, как слинковаться с этой библиотекой

с .dll линковаться нельзя. обычно линкуются с .lib, и получают .exe который зависит от наличия .dll
Re[5]: libevent: как её прилинковать к проекту под Windows?
От: reversecode google
Дата: 14.02.18 13:38
Оценка:
правильную lib укажите (скорее всего *core.lib)
Re[6]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 13:41
Оценка:
K13>Проблема четко указана: не найдена event.dll

Спасибо за совет.
Да, такая штука, о которой Вы говорите — часто применяется в windows — программах.

Думаю, что здесь — не тот случай.
Потому что event.dll не существует в природе.
libevent — как я понял из описанийц — максимально кросплатформенна и не существует в виде DLL — ек.

Надо как то объяснить студии, что мне нужна в этом месте статическая линковка с либой event.lib.
И убрать эти либы из того места, в которое я их засунул в попытках хоть как то собрать проект
(junecat.ru/Storage/oth/le_pic5.jpg)
Re[7]: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 13:46
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>Думаю, что здесь — не тот случай.

SLH>Потому что event.dll не существует в природе.
SLH>libevent — как я понял из описанийц — максимально кросплатформенна и не существует в виде DLL — ек.
Думаю, что существует.

Из файла \include\event2\visibility.h:
#if defined(event_shared_EXPORTS) || \
    defined(event_extra_shared_EXPORTS) || \
    defined(event_core_shared_EXPORTS) || \
    defined(event_pthreads_shared_EXPORTS) || \
    defined(event_openssl_shared_EXPORTS)

# if defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
#  define EVENT2_EXPORT_SYMBOL __global
# elif defined __GNUC__
#  define EVENT2_EXPORT_SYMBOL __attribute__ ((visibility("default")))
# elif defined(_MSC_VER)
#  define EVENT2_EXPORT_SYMBOL __declspec(dllexport)
# else
#  define EVENT2_EXPORT_SYMBOL /* unknown compiler */
# endif

#else /* event_*_EXPORTS */

# define EVENT2_EXPORT_SYMBOL

#endif /* event_*_EXPORTS */

/** We need to dllimport event_debug_logging_mask_ into event_extra */
#if defined(_MSC_VER)
# if defined(event_core_shared_EXPORTS) /** from core export */
#  define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllexport)
# elif defined(event_extra_shared_EXPORTS) /** from extra import */
#  define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllimport)
# endif
#endif /* _MSC_VER */
#if !defined(EVENT2_CORE_EXPORT_SYMBOL)
# define EVENT2_CORE_EXPORT_SYMBOL EVENT2_EXPORT_SYMBOL
#endif


проверяется компилятор _MSC_VER — это сутидя Майкрософта.
И если компилятор Макйрософт — по используются специфицные для MS вещи такие как __declspec(dllexport) — помечает что данная функция будет экспортирована из ДЛЛ.
__declspec(dllimport) — наоборот — функция будет браться из DLL.
Вещи, стандартные для Windows. Так что подразумевается какая-то DLL.
Третий Рим должен пасть!
Re[6]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 14:00
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, SteeLHeaD, Вы писали:



GC>>>Еще, подозреваю там символа препроцессора нужно правильно устанавливать.

SLH>>А что это такое и как этоделать?
GC>Вкладка С\С++ -> Preprocessor -> Preprocessor Definitions
GC>если DLL действительно нет (лучше поискать во всем подпапкам проекта) то символ будет в духе LIB_EVENT_USE_STATIC_LIB
GC>А вообще лучше заголовочные файлы почитайте от libevent, event.h — там должно быть их использвание.

1) я попробобвал.
поставил эти Preprocessor Definitions как показано на картинке:
  http://junecat.ru/Storage/oth/le_pic9.jpg


Ничего не изменилось — то есть я опять получал ошибку при запуске.

2)ТОгда я убрал эти три библиотеки из того места, где указываются Additional Dependencies для линкера...
(ну, потому что я вижу там файлы типа kernel32.dll, пот которым видно, что их можно линковать только динамически, и делаю вывод, что всё, что там указано — преждназначено для динамической линковки.) — и обратно получил обратно ошибку линкера "error LNK2019: unresolved external symbol _event_init referenced in function _main"


3) я посмотрел в файл event.h — он размером три килобайта, больше чем наполовину состоит из copyright — сообщения, и не сожержит никаких примеров использования или специальных слов типа "в случае использования под windows — сделайте вот это"
Можно посомтреть на этот файл на гитхабе:
https://github.com/libevent/libevent
Re[7]: libevent: как её прилинковать к проекту под Windows?
От: GhostCoders Россия  
Дата: 14.02.18 14:09
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>3) я посмотрел в файл event.h — он размером три килобайта, больше чем наполовину состоит из copyright — сообщения, и не сожержит никаких примеров использования или специальных слов типа "в случае использования под windows — сделайте вот это"

Не нужно воспринимать это буквально, там еще куча всяких заголовков.
Вообщем, попробуйте определить символ препроцессора EVENT2_EXPORT_SYMBOL
Третий Рим должен пасть!
Re[8]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 14:14
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, SteeLHeaD, Вы писали:


SLH>>Думаю, что здесь — не тот случай.

SLH>>Потому что event.dll не существует в природе.
SLH>>libevent — как я понял из описанийц — максимально кросплатформенна и не существует в виде DLL — ек.
GC>Думаю, что существует.

GC>Из файла \include\event2\visibility.h:

GC>
GC>#if defined(event_shared_EXPORTS) || \
GC>    defined(event_extra_shared_EXPORTS) || \
GC>    defined(event_core_shared_EXPORTS) || \
GC>    defined(event_pthreads_shared_EXPORTS) || \
GC>    defined(event_openssl_shared_EXPORTS)

GC># if defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
GC>#  define EVENT2_EXPORT_SYMBOL __global
GC># elif defined __GNUC__
GC>#  define EVENT2_EXPORT_SYMBOL __attribute__ ((visibility("default")))
GC># elif defined(_MSC_VER)
GC>#  define EVENT2_EXPORT_SYMBOL __declspec(dllexport)
GC># else
GC>#  define EVENT2_EXPORT_SYMBOL /* unknown compiler */
GC># endif

GC>#else /* event_*_EXPORTS */

GC># define EVENT2_EXPORT_SYMBOL

GC>#endif /* event_*_EXPORTS */

GC>/** We need to dllimport event_debug_logging_mask_ into event_extra */
GC>#if defined(_MSC_VER)
GC># if defined(event_core_shared_EXPORTS) /** from core export */
GC>#  define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllexport)
GC># elif defined(event_extra_shared_EXPORTS) /** from extra import */
GC>#  define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllimport)
GC># endif
GC>#endif /* _MSC_VER */
GC>#if !defined(EVENT2_CORE_EXPORT_SYMBOL)
GC># define EVENT2_CORE_EXPORT_SYMBOL EVENT2_EXPORT_SYMBOL
GC>#endif
GC>


GC>проверяется компилятор _MSC_VER — это сутидя Майкрософта.

GC>И если компилятор Макйрософт — по используются специфицные для MS вещи такие как __declspec(dllexport) — помечает что данная функция будет экспортирована из ДЛЛ.
GC>__declspec(dllimport) — наоборот — функция будет браться из DLL.
GC>Вещи, стандартные для Windows. Так что подразумевается какая-то DLL.

КРУТО!
теперь у меня программа запускается, сообщение при запуске:
[warn] evsig_init_: socketpair: Either the application has not called WSAStartup, or WSAStartup failed.


Дорогой человек, как я могу тебя отблагодарить?
ты не послал меня с первого же замечания,
и вы вместе добиваемся победы.
Re[9]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 14.02.18 14:19
Оценка:
SLH>КРУТО!
SLH>теперь у меня программа запускается, сообщение при запуске:
SLH>
SLH>[warn] evsig_init_: socketpair: Either the application has not called WSAStartup, or WSAStartup failed.
SLH>


SLH>Дорогой человек, как я могу тебя отблагодарить?

SLH>ты не послал меня с первого же замечания,
SLH>и вы вместе добиваемся победы.

Пишу вдогонку — но по прежнему не работает...
Сейчас программа под виндой выглядит как

  программа
#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[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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: niXman Ниоткуда https://github.com/niXman
Дата: 14.02.18 17:30
Оценка:
Здравствуйте, niXman, Вы писали:

X>для каких целей вам понадобилась именно эта либа? может быть есть что-то другое, попроще, возможно, даже, хидер-онли...


и да. еще не понятно, чем вам не подходит MSYS2?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: libevent: как её прилинковать к проекту под Windows?
От: MTD https://github.com/mtrempoltsev
Дата: 14.02.18 19:51
Оценка: +1
Здравствуйте, SteeLHeaD, Вы писали:

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


Вопросы от которых зависят ответы:
1. Тебе OpenSSL нужна или нет?
2. Статически хочешь линковаться или динамически?
3. Рантайм статический или динамический?
4. Для x84 или x64?

И еще, ты в курсе, что на всех картинках ты менял настройки только для конфигурации Debug?
Re[11]: libevent: как её прилинковать к проекту под Windows?
От: Zhendos  
Дата: 14.02.18 22:50
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>Здравствуйте, reversecode, Вы писали:



R>>

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

SLH>Примеров везде дофига.

SLH>я ж сказал — у мня на линукс это заработало за 15 мин.
SLH>Но отлаживаться мне надо под виндой.

Ну используйте подсистему Linux на Windows, и делайте тоже самое
что делали и на Linux.

SLH>Если, конечно, MS И дальше будет таким же открытым и современным — возможно, появится версия "студии" под линукс, но пока её нет.

SLH>И даже связываться с полушаманскими методиками отладки под линуксом из под винды типа
SLH>https://habrahabr.ru/company/microsoft/blog/319962/
SLH>мне не очень хочется.

Поставьте CLion на Linux, она будет "подружелюбнее" visual studio,
и отлаживайтесь в ней.
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 15.02.18 01:30
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, SteeLHeaD, Вы писали:


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


MTD>Вопросы от которых зависят ответы:

MTD>1. Тебе OpenSSL нужна или нет?
MTD>2. Статически хочешь линковаться или динамически?
MTD>3. Рантайм статический или динамический?
MTD>4. Для x84 или x64?

MTD>И еще, ты в курсе, что на всех картинках ты менял настройки только для конфигурации Debug?


1. Нужна.
Но, так как я не умею читать мысли не могу телепатически узнать, в какое значение устанавливать переменную
OPENSSL_CRYPTO_LIBRARY — наверно, придётся пойти читать мейк — файл.
Пока — я нашел способ собрать библиотеку без OpenSSL

2. Хочу статически, но никаких инструкий на эту тему не нашел.
Я деже не понимаю, можно ли эту библиотеку собрать статически.
Не то что статически с ней слинковаться.
Пока — я просто закидываю DLL — ки, котрые она нагенерила, в ту же папку, где лежит EXEшник.

3. Не понял вопроса. я так понимаю, что это напрямую следует из ответа номер два.
Если я не прав — где мне про это прочитать? (Наверняка есть какая то специальная глава в джефри — рихтере.)

4. Для x64.

Но я вообще то выкрутился.
В форуме на cyberforum.ru мне дали такую очень полезную наводку — пример hello world,
в коротом действительно под виндой надо руками запустить винсокет.
Вот сколько лет на винсокетах под виндой спотыкаюсь — и каждый раз за новом месте!

подсказка звучала так:
"Глядите пример libevent/sample/hello-world.c — нужно вызывать."
Точно...
Да, стал сравнивать, и в отдадчике нашел, в каком месте в одном случае инициализация происходит, а в другом — не происходит.
Оказалось, что под виндовс ДЕЙСТВИТЕЛЬНО надо в самом начале функции main написать
#ifdef _WIN32
    WSADATA wsa_data;
    WSAStartup(0x0201, &wsa_data);
#endif

Как говорится, никогда не было, и вот опять!
Нет, это никогда не надоедает!
Отредактировано 15.02.2018 1:32 SteeLHeaD . Предыдущая версия .
Re[3]: libevent: как её прилинковать к проекту под Windows?
От: MTD https://github.com/mtrempoltsev
Дата: 15.02.18 04:55
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>Как говорится, никогда не было, и вот опять!


Судя по потоку мыслей помощь поможет тебе ровно одна — взять и самому все сделать, параллельно объяснив базу, но это сильно выходит за рамки одного сообщения. Поэтому выдохни и ничего не делай неделю, потом начни читать про процессы компиляции и линковки, основательно, не спеша. Через месяц все соберешь, но уже с пониманием процессов.
Re[13]: libevent: как её прилинковать к проекту под Windows?
От: Mr.Delphist  
Дата: 15.02.18 06:55
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>У меня нет к Вам претензий.

SLH>Но я прочитал документацию.
SLH>конкретно — я прочитал вот это:
SLH>руководство по libevent на русском
SLH>В руководстве мне всё понятно.
SLH>Но там нигде нет главы "какие галочки поставить в среде разработки Visual Studio 2015, чтобы заработал хотя бы hello world".
SLH>Поэтому и приходится заниматься догадками.

Гым-гым. Переезжайте-ка Вы из страны розовых эльфов в наше мордорское рукоблудие

Если бы каждая либа занималась тем, что сначала инициализировала все подсистемы, то авторов этих поделий очень быстро бы избавили от ереси в лучших традициях XVII века.
Поймите, libevent всего лишь библиотека (это не Фреймворк, время жизни которого всегда равно времени жизни программы). Поэтому Libevent понятия не имеет, был ли инициализирован WinSock на момент её загрузки, надо ли его деинициализировать по выгрузке библиотеки и т.п. К тому же, на каждой платформе могут добавляться свои нюансы — посмотрите исходники того же pjSIP для интереса, там реально жЫр кроссплатформы.
Re: libevent: как её прилинковать к проекту под Windows?
От: Dambo Россия  
Дата: 15.02.18 09:40
Оценка:
https://github.com/Microsoft/vcpkg

есть ваша либа, можно собирать x86,x64 и для них же статики
Re[2]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 15.02.18 10:03
Оценка:
Здравствуйте, Dambo, Вы писали:


D>https://github.com/Microsoft/vcpkg


D>есть ваша либа, можно собирать x86,x64 и для них же статики

Спасибо. это интересно. и как то я там не догадался посмотреть, хотя само напрашивается.
Спасибо за наводку!
Re[4]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 15.02.18 10:04
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, SteeLHeaD, Вы писали:


SLH>>Как говорится, никогда не было, и вот опять!


MTD>Судя по потоку мыслей помощь поможет тебе ровно одна — взять и самому все сделать, параллельно объяснив базу, но это сильно выходит за рамки одного сообщения. Поэтому выдохни и ничего не делай неделю, потом начни читать про процессы компиляции и линковки, основательно, не спеша. Через месяц все соберешь, но уже с пониманием процессов.


Да, спасибо, это хороший совет.
Re: libevent: как её прилинковать к проекту под Windows?
От: vasvladal  
Дата: 15.02.18 10:07
Оценка:
Посмотрите здесь:
Re: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 19.02.18 09:45
Оценка: :)
На тему моих приключений с WinSock я даже специально нарисовал демотиватор для молодых программистов:

Re[2]: libevent: как её прилинковать к проекту под Windows?
От: SteeLHeaD  
Дата: 19.02.18 10:28
Оценка:
Здравствуйте, vasvladal, Вы писали:

V>Посмотрите здесь:


Спасибо!
это тоже интересно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.