'uWebSockets undefined references in eclipse cpp ide

I'm new to c++ and i miss many knowledge about it. Mostly i get the work done by try and error. But now i stuck on setting up a test project for a websocket server using uWebSockets. Badly there is no installation documentation available and it is not available as a C Library.

I cloned the repo recursive (because of the submodule uSockets) and executed make and make install. So far so good, without errors.

I tried to create a new Managed C++ Project in eclipse and added a main.cpp into src/ with the content of this file

I set Include Paths to /usr/local/include /root/uWebSockets/uSockets/src and /usr/local/include/uWebSockets

I also set the compiler dialect to version c++17 (as this is required for uWebSockets)

And now i'm getting many errors during build and i have no clue how to resolve them:

13:58:48 **** Incremental Build of configuration Debug for project websocket-test ****
make all 
Building file: ../src/main.cpp
Invoking: GCC C++ Compiler
g++ -std=c++17 -I/usr/local/include -I/root/uWebSockets/uSockets/src -I/usr/local/include/uWebSockets -O0 -g3 -Wall -Wconversion -c -fmessage-length=0 -pthread -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.cpp"
Finished building: ../src/main.cpp

Building target: websocket-test
Invoking: GCC C++ Linker
g++ -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -pthread -o "websocket-test"  ./src/main.o   
./src/main.o: In function `auto uWS::TemplatedApp<false>::ws<main::PerSocketData>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, uWS::TemplatedApp<false>::WebSocketBehavior&&)::{lambda(auto:1*, auto:2*)#2}::operator()<uWS::HttpResponse<false>, uWS::HttpRequest>(uWS::HttpResponse<false>*, uWS::HttpRequest*)':
/usr/local/include/uWebSockets/App.h:222: undefined reference to `us_socket_context_adopt_socket'
/usr/local/include/uWebSockets/App.h:234: undefined reference to `us_socket_timeout'
./src/main.o: In function `uWS::TemplatedApp<false>&& uWS::TemplatedApp<false>::ws<main::PerSocketData>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, uWS::TemplatedApp<false>::WebSocketBehavior&&)':
/usr/local/include/uWebSockets/App.h:122: undefined reference to `us_socket_context_loop'
/usr/local/include/uWebSockets/App.h:122: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::DeflationStream::DeflationStream(int)':
/usr/local/include/uWebSockets/PerMessageDeflate.h:131: undefined reference to `deflateInit2_'
./src/main.o: In function `uWS::DeflationStream::deflate(uWS::ZlibContext*, std::basic_string_view<char, std::char_traits<char> >, bool)':
/usr/local/include/uWebSockets/PerMessageDeflate.h:150: undefined reference to `deflate'
/usr/local/include/uWebSockets/PerMessageDeflate.h:161: undefined reference to `deflateReset'
./src/main.o: In function `uWS::DeflationStream::~DeflationStream()':
/usr/local/include/uWebSockets/PerMessageDeflate.h:177: undefined reference to `deflateEnd'
./src/main.o: In function `uWS::InflationStream::InflationStream()':
/usr/local/include/uWebSockets/PerMessageDeflate.h:185: undefined reference to `inflateInit2_'
./src/main.o: In function `uWS::InflationStream::~InflationStream()':
/usr/local/include/uWebSockets/PerMessageDeflate.h:189: undefined reference to `inflateEnd'
./src/main.o: In function `uWS::InflationStream::inflate(uWS::ZlibContext*, std::basic_string_view<char, std::char_traits<char> >, unsigned long)':
/usr/local/include/uWebSockets/PerMessageDeflate.h:206: undefined reference to `inflate'
/usr/local/include/uWebSockets/PerMessageDeflate.h:216: undefined reference to `inflateReset'
./src/main.o: In function `uWS::Loop::wakeupCb(us_loop_t*)':
/usr/local/include/uWebSockets/Loop.h:30: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::preCb(us_loop_t*)':
/usr/local/include/uWebSockets/Loop.h:46: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::postCb(us_loop_t*)':
/usr/local/include/uWebSockets/Loop.h:54: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::init()':
makefile:45: recipe for target 'websocket-test' failed
/usr/local/include/uWebSockets/Loop.h:65: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::create(void*)':
/usr/local/include/uWebSockets/Loop.h:70: undefined reference to `us_create_loop'
./src/main.o: In function `uWS::Loop::free()':
/usr/local/include/uWebSockets/Loop.h:106: undefined reference to `us_loop_ext'
/usr/local/include/uWebSockets/Loop.h:109: undefined reference to `us_loop_free'
./src/main.o: In function `uWS::Loop::addPostHandler(void*, fu2::abi_400::detail::function<fu2::abi_400::detail::config<true, false, fu2::capacity_default>, fu2::abi_400::detail::property<true, false, void (uWS::Loop*)> >&&)':
/usr/local/include/uWebSockets/Loop.h:113: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::removePostHandler(void*)':
/usr/local/include/uWebSockets/Loop.h:120: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::addPreHandler(void*, fu2::abi_400::detail::function<fu2::abi_400::detail::config<true, false, fu2::capacity_default>, fu2::abi_400::detail::property<true, false, void (uWS::Loop*)> >&&)':
/usr/local/include/uWebSockets/Loop.h:126: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::removePreHandler(void*)':
/usr/local/include/uWebSockets/Loop.h:133: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::Loop::run()':
/usr/local/include/uWebSockets/Loop.h:152: undefined reference to `us_loop_run'
./src/main.o: In function `uWS::WebSocket<false, true>::send(std::basic_string_view<char, std::char_traits<char> >, uWS::OpCode, bool)':
/usr/local/include/uWebSockets/WebSocket.h:109: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocket.h:109: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::HttpContext<false>::create(uWS::Loop*, us_socket_context_options_t)':
/usr/local/include/uWebSockets/HttpContext.h:325: undefined reference to `us_create_socket_context'
/usr/local/include/uWebSockets/HttpContext.h:332: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::HttpContext<false>::free()':
/usr/local/include/uWebSockets/HttpContext.h:343: undefined reference to `us_socket_context_free'
./src/main.o: In function `uWS::WebSocketContext<false, true>::free()':
/usr/local/include/uWebSockets/WebSocketContext.h:368: undefined reference to `us_socket_context_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:371: undefined reference to `us_socket_context_free'
./src/main.o: In function `uWS::AsyncSocket<false>::getAsyncSocketData()':
/usr/local/include/uWebSockets/AsyncSocket.h:45: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::AsyncSocket<false>::getLoopData()':
/usr/local/include/uWebSockets/AsyncSocket.h:40: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/AsyncSocket.h:40: undefined reference to `us_socket_context_loop'
/usr/local/include/uWebSockets/AsyncSocket.h:40: undefined reference to `us_loop_ext'
./src/main.o: In function `uWS::AsyncSocket<false>::write(char const*, int, bool, int)':
/usr/local/include/uWebSockets/AsyncSocket.h:111: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/AsyncSocket.h:121: undefined reference to `us_socket_write'
/usr/local/include/uWebSockets/AsyncSocket.h:169: undefined reference to `us_socket_write'
./src/main.o: In function `uWS::AsyncSocket<false>::timeout(unsigned int)':
/usr/local/include/uWebSockets/AsyncSocket.h:50: undefined reference to `us_socket_timeout'
./src/main.o: In function `uWS::WebSocketContext<false, true>::create(uWS::Loop*, us_socket_context_t*)':
/usr/local/include/uWebSockets/WebSocketContext.h:377: undefined reference to `us_create_child_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:383: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::WebSocketContext<false, true>::getExt()':
/usr/local/include/uWebSockets/WebSocketContext.h:40: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::WebSocket<false, true>::getUserData()':
/usr/local/include/uWebSockets/WebSocket.h:44: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::WebSocket<false, true>::init(bool, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)':
/usr/local/include/uWebSockets/WebSocket.h:37: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::HttpContext<false>::listen(char const*, int, int)':
/usr/local/include/uWebSockets/HttpContext.h:385: undefined reference to `us_socket_context_listen'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*, int, char*, int)#1}::operator()(us_socket_t*, int, char*, int) const':
/usr/local/include/uWebSockets/HttpContext.h:65: undefined reference to `us_socket_timeout'
/usr/local/include/uWebSockets/HttpContext.h:68: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*)#2}::operator()(us_socket_t*) const':
/usr/local/include/uWebSockets/HttpContext.h:82: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*, char*, int)#3}::operator()(us_socket_t*, char*, int) const':
/usr/local/include/uWebSockets/HttpContext.h:113: undefined reference to `us_socket_is_shut_down'
/usr/local/include/uWebSockets/HttpContext.h:117: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*, char*, int)#3}::operator()(us_socket_t*, char*, int) const::{lambda(void*, uWS::HttpRequest*)#1}::operator()({lambda(us_socket_t*, char*, int)#3}, uWS::HttpRequest) const':
/usr/local/include/uWebSockets/HttpContext.h:129: undefined reference to `us_socket_timeout'
/usr/local/include/uWebSockets/HttpContext.h:132: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/HttpContext.h:137: undefined reference to `us_socket_close'
/usr/local/include/uWebSockets/HttpContext.h:148: undefined reference to `us_socket_close'
/usr/local/include/uWebSockets/HttpContext.h:159: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/HttpContext.h:164: undefined reference to `us_socket_is_shut_down'
/usr/local/include/uWebSockets/HttpContext.h:177: undefined reference to `us_socket_timeout'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*, char*, int)#3}::operator()(us_socket_t*, char*, int) const::{lambda(void*, std::basic_string_view<char, std::char_traits<char> >, bool)#2}::operator()({lambda(us_socket_t*, char*, int)#3}, std::char_traits<char>, bool) const':
/usr/local/include/uWebSockets/HttpContext.h:190: undefined reference to `us_socket_timeout'
/usr/local/include/uWebSockets/HttpContext.h:193: undefined reference to `us_socket_timeout'
/usr/local/include/uWebSockets/HttpContext.h:200: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/HttpContext.h:205: undefined reference to `us_socket_is_shut_down'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*, char*, int)#3}::operator()(us_socket_t*, char*, int) const::{lambda(void*)#3}::operator()({lambda(us_socket_t*, char*, int)#3}) const':
/usr/local/include/uWebSockets/HttpContext.h:218: undefined reference to `us_socket_close'
./src/main.o: In function `uWS::HttpContext<false>::init()::{lambda(us_socket_t*)#4}::operator()(us_socket_t*) const':
/usr/local/include/uWebSockets/HttpContext.h:266: undefined reference to `us_socket_timeout'
./src/main.o: In function `uWS::HttpContext<false>::init()':
/usr/local/include/uWebSockets/HttpContext.h:63: undefined reference to `us_socket_context_on_open'
/usr/local/include/uWebSockets/HttpContext.h:80: undefined reference to `us_socket_context_on_close'
/usr/local/include/uWebSockets/HttpContext.h:102: undefined reference to `us_socket_context_on_data'
/usr/local/include/uWebSockets/HttpContext.h:258: undefined reference to `us_socket_context_on_writable'
/usr/local/include/uWebSockets/HttpContext.h:293: undefined reference to `us_socket_context_on_end'
/usr/local/include/uWebSockets/HttpContext.h:302: undefined reference to `us_socket_context_on_timeout'
./src/main.o: In function `uWS::HttpContext<false>::getSocketContextData()':
/usr/local/include/uWebSockets/HttpContext.h:53: undefined reference to `us_socket_context_ext'
./src/main.o: In function `auto uWS::WebSocketContext<false, true>::init()::{lambda(auto:1*)#1}::operator()<us_socket_t>(us_socket_t*) const':
/usr/local/include/uWebSockets/WebSocketContext.h:242: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:245: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:245: undefined reference to `us_socket_context_ext'
./src/main.o: In function `auto uWS::WebSocketContext<false, true>::init()::{lambda(auto:1*, char*, int)#2}::operator()<us_socket_t>(us_socket_t*, char*, int) const':
/usr/local/include/uWebSockets/WebSocketContext.h:267: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:275: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:275: undefined reference to `us_socket_context_ext'
./src/main.o: In function `auto uWS::WebSocketContext<false, true>::init()::{lambda(auto:1*)#3}::operator()<us_socket_t>(us_socket_t*) const':
/usr/local/include/uWebSockets/WebSocketContext.h:306: undefined reference to `us_socket_is_shut_down'
/usr/local/include/uWebSockets/WebSocketContext.h:311: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:323: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:323: undefined reference to `us_socket_context_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:336: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:336: undefined reference to `us_socket_context_ext'
./src/main.o: In function `auto uWS::WebSocketContext<false, true>::init()::{lambda(auto:1*)#4}::operator()<us_socket_t>(us_socket_t*) const':
/usr/local/include/uWebSockets/WebSocketContext.h:350: undefined reference to `us_socket_close'
./src/main.o: In function `auto uWS::WebSocketContext<false, true>::init()::{lambda(auto:1*)#5}::operator()<us_socket_t>(us_socket_t*) const':
/usr/local/include/uWebSockets/WebSocketContext.h:359: undefined reference to `us_socket_close'
./src/main.o: In function `uWS::WebSocketContext<false, true>::init()':
/usr/local/include/uWebSockets/WebSocketContext.h:240: undefined reference to `us_socket_context_on_close'
/usr/local/include/uWebSockets/WebSocketContext.h:264: undefined reference to `us_socket_context_on_data'
/usr/local/include/uWebSockets/WebSocketContext.h:303: undefined reference to `us_socket_context_on_writable'
/usr/local/include/uWebSockets/WebSocketContext.h:347: undefined reference to `us_socket_context_on_end'
/usr/local/include/uWebSockets/WebSocketContext.h:356: undefined reference to `us_socket_context_on_timeout'
./src/main.o: In function `uWS::HttpContext<false>::getSocketContextDataS(us_socket_t*)':
/usr/local/include/uWebSockets/HttpContext.h:57: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::AsyncSocket<false>::close()':
/usr/local/include/uWebSockets/AsyncSocket.h:60: undefined reference to `us_socket_close'
./src/main.o: In function `uWS::AsyncSocket<false>::shutdown()':
/usr/local/include/uWebSockets/AsyncSocket.h:55: undefined reference to `us_socket_shutdown'
./src/main.o: In function `uWS::HttpContext<false>::getSocketContext(us_socket_t*)':
/usr/local/include/uWebSockets/HttpContext.h:49: undefined reference to `us_socket_context'
./src/main.o: In function `uWS::WebSocketContext<false, true>::setCompressed(uWS::WebSocketState<true>*, void*)':
/usr/local/include/uWebSockets/WebSocketContext.h:45: undefined reference to `us_socket_ext'
./src/main.o: In function `uWS::WebSocketContext<false, true>::forceClose(uWS::WebSocketState<true>*, void*)':
/usr/local/include/uWebSockets/WebSocketContext.h:56: undefined reference to `us_socket_close'
./src/main.o: In function `uWS::WebSocketContext<false, true>::refusePayloadLength(unsigned long, uWS::WebSocketState<true>*, void*)':
/usr/local/include/uWebSockets/WebSocketContext.h:228: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:228: undefined reference to `us_socket_context_ext'
./src/main.o: In function `uWS::WebSocketContext<false, true>::handleFragment(char*, unsigned long, unsigned int, int, bool, uWS::WebSocketState<true>*, void*)':
/usr/local/include/uWebSockets/WebSocketContext.h:62: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:62: undefined reference to `us_socket_context_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:63: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:74: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:74: undefined reference to `us_socket_context_loop'
/usr/local/include/uWebSockets/WebSocketContext.h:74: undefined reference to `us_loop_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:94: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/WebSocketContext.h:121: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocketContext.h:121: undefined reference to `us_socket_context_loop'
/usr/local/include/uWebSockets/WebSocketContext.h:121: undefined reference to `us_loop_ext'
/usr/local/include/uWebSockets/WebSocketContext.h:152: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/WebSocketContext.h:175: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/WebSocketContext.h:182: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/WebSocketContext.h:204: undefined reference to `us_socket_is_closed'
/usr/local/include/uWebSockets/WebSocketContext.h:211: undefined reference to `us_socket_is_closed'
./src/main.o: In function `uWS::WebSocket<false, true>::end(int, std::basic_string_view<char, std::char_traits<char> >)':
/usr/local/include/uWebSockets/WebSocket.h:121: undefined reference to `us_socket_ext'
/usr/local/include/uWebSockets/WebSocket.h:147: undefined reference to `us_socket_context'
/usr/local/include/uWebSockets/WebSocket.h:147: undefined reference to `us_socket_context_ext'
collect2: error: ld returned 1 exit status
make: *** [websocket-test] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

13:58:55 Build Failed. 117 errors, 0 warnings. (took 6s.326ms)

If i try to link usockets i get cannot find -lusockets. I hope somebody can help me with this. :-/



Solution 1:[1]

You need to link the static uSockets.a library to your code. Suppose, you copied the uSockets.a lib to /usr/local/lib, then this is how you'd build your code:

g++ main.cpp -o main.o -std=c++17 -I/usr/local/include/uWebSockets -L/usr/local/lib -lz -lpthread -l:uSockets.a

the -L flag tells the linker where to look for libraries. -lz links the zlib and the -l:uSockets.a links the static uSockets library which is the cause of the linker error. You will have to add -lssl if you are using the ssl options.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1