g ++ unknown /tmp/cc21HhMd.o: в функции `main :: {lambda (ошибка компиляции - PullRequest
0 голосов
/ 23 декабря 2019

Я пытаюсь скомпилировать с помощью g ++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) некоторый простой сервер с открытым исходным кодом, использующий uvlib, который я успешно скомпилировал, это репозиторий github:

https://github.com/Matheus28/ws28

это команда компиляции:

g++  echo.cpp -Wall -O0 -g -std=c++1y -I/home/vagrant/libuv/include -Isrc -L/home/vagrant/libuv/build -lssl -lcrypto -luv

но она дает мне ошибку компиляции:

/tmp/cc21HhMd.o: In function `main::{lambda(ws28::Client*, char const*, unsigned long, int)#4}::operator()(ws28::Client*, char const*, unsigned long, int) const':
/home/vagrant/ws28/echo.cpp:36: undefined reference to `ws28::Client::Send(char const*, unsigned long, unsigned char)'
/tmp/cc21HhMd.o: In function `main::{lambda(uv_timer_s*)#6}::operator()(uv_timer_s*) const':
/home/vagrant/ws28/echo.cpp:58: undefined reference to `ws28::Server::StopListening()'
/tmp/cc21HhMd.o: In function `main':
/home/vagrant/ws28/echo.cpp:16: undefined reference to `ws28::Server::Server(uv_loop_s*, ssl_ctx_st*)'
/home/vagrant/ws28/echo.cpp:64: undefined reference to `ws28::Server::Listen(int, bool)'
/home/vagrant/ws28/echo.cpp:69: undefined reference to `ws28::Server::~Server()'
/home/vagrant/ws28/echo.cpp:69: undefined reference to `ws28::Server::~Server()'
collect2: error: ld returned 1 exit status
make: *** [out] Error 1

что я не понимаю, так это то, чтолиния, которая обрабатывает этот объект, откуда он пришел?:

/tmp/cc21HhMd.o: In function `main::{lambda(ws28::Client*, char const*, unsigned long, int)#4}::operator()(ws28::Client*, char const*, unsigned long, int) const':

1 Ответ

1 голос
/ 23 декабря 2019

Чтобы ответить на ваш внешний вопрос: Вам все еще нужно скомпилировать и связать файлы .cpp в src в связанном репозитории GitHub. Вы не сказали нам, какая у вас система сборки, но я бы порекомендовал связать файлы ws28 src в статическую библиотеку и сделать ссылку на нее. Затем вы можете скомпилировать echo.cpp, связавшись со статической библиотекой.

В качестве альтернативы, вы можете просто сделать g++ echo.cpp src/*.cpp ..., если вы не против перекомпилировать библиотеку ws28 каждый раз.

Что касается вашеговнутренний вопрос: каждая [](...){...} вещь является лямбда-выражением . Компилятор создает анонимный функтор, у которого тело лямбды имеет значение operator(). Номера строк в сообщении об ошибке точно указывают, какая лямбда-функция нужна.

...