eidheim / Simple-WebSocket-Server

A very simple, fast, multithreaded, platform independent WebSocket (WS) and WebSocket Secure (WSS) server and client library implemented using C++11, Boost.Asio and OpenSSL. Created to be an easy way to make WebSocket endpoints in C++.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Standalone Asio not found - but asio.hpp is present

galeone opened this issue · comments

Hi, thank you for this library!

I'm trying to use the library with ASIO but, although it's installed in my system, cmake fails.

My environment:
OS: Archlinux
compiler: clang
cmake version: 3.10.3

Steps to reproduce:

git clone https://github.com/eidheim/Simple-WebSocket-Server/
cd Simple-WebSocket-Server
mkdir build
cd build
cmake -DUSE_STANDALONE_ASIO=ON ..

Error: Standalone Asio not found

But ls /usr/include/asio* returns:

/usr/include/asio.hpp

/usr/include/asio:
associated_allocator.hpp     basic_socket.hpp              buffered_stream.hpp            defer.hpp                      handler_invoke_hook.hpp    is_write_buffered.hpp          serial_port_base.hpp         strand.hpp                 unyield.hpp
associated_executor.hpp      basic_socket_iostream.hpp     buffered_write_stream_fwd.hpp  detail                         handler_type.hpp           local                          serial_port.hpp              streambuf.hpp              use_future.hpp
async_result.hpp             basic_socket_streambuf.hpp    buffered_write_stream.hpp      dispatch.hpp                   high_resolution_timer.hpp  packaged_task.hpp              serial_port_service.hpp      stream_socket_service.hpp  uses_executor.hpp
basic_datagram_socket.hpp    basic_streambuf_fwd.hpp       buffer.hpp                     error_code.hpp                 impl                       placeholders.hpp               signal_set.hpp               system_context.hpp         version.hpp
basic_deadline_timer.hpp     basic_streambuf.hpp           buffers_iterator.hpp           error.hpp                      io_context.hpp             posix                          signal_set_service.hpp       system_error.hpp           waitable_timer_service.hpp
basic_io_object.hpp          basic_stream_socket.hpp       completion_condition.hpp       execution_context.hpp          io_context_strand.hpp      post.hpp                       socket_acceptor_service.hpp  system_executor.hpp        wait_traits.hpp
basic_raw_socket.hpp         basic_waitable_timer.hpp      connect.hpp                    executor.hpp                   io_service.hpp             raw_socket_service.hpp         socket_base.hpp              system_timer.hpp           windows
basic_seq_packet_socket.hpp  bind_executor.hpp             coroutine.hpp                  executor_work_guard.hpp        io_service_strand.hpp      read_at.hpp                    spawn.hpp                    thread.hpp                 write_at.hpp
basic_serial_port.hpp        buffered_read_stream_fwd.hpp  datagram_socket_service.hpp    generic                        ip                         read.hpp                       ssl                          thread_pool.hpp            write.hpp
basic_signal_set.hpp         buffered_read_stream.hpp      deadline_timer.hpp             handler_alloc_hook.hpp         is_executor.hpp            read_until.hpp                 ssl.hpp                      time_traits.hpp            yield.hpp
basic_socket_acceptor.hpp    buffered_stream_fwd.hpp       deadline_timer_service.hpp     handler_continuation_hook.hpp  is_read_buffered.hpp       seq_packet_socket_service.hpp  steady_timer.hpp             ts

Hence asio.hpp is present and the whole asio library too.

How can I fix this? (My guess is that the problem is related to cmake somehow)

Thank you

The problem is in pthread linking, it looks like your CMake file (when using CHECK_INCLUDE_FILE_CXX(asio.hpp)) does not link against pthread

Determining if the include file asio.hpp exists failed with the following output:
Change Dir: /tmp/Simple-WebSocket-Server/build/CMakeFiles/CMakeTmp

Run Build Command:"/usr/bin/make" "cmTC_1b98a/fast"
/usr/bin/make -f CMakeFiles/cmTC_1b98a.dir/build.make CMakeFiles/cmTC_1b98a.dir/build
make[1]: Entering directory '/tmp/Simple-WebSocket-Server/build/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_1b98a.dir/CheckIncludeFile.cxx.o
/usr/bin/c++     -o CMakeFiles/cmTC_1b98a.dir/CheckIncludeFile.cxx.o -c /tmp/Simple-WebSocket-Server/build/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx
Linking CXX executable cmTC_1b98a
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1b98a.dir/link.txt --verbose=1
/usr/bin/c++       -rdynamic CMakeFiles/cmTC_1b98a.dir/CheckIncludeFile.cxx.o  -o cmTC_1b98a 
CMakeFiles/cmTC_1b98a.dir/CheckIncludeFile.cxx.o: In function `asio::detail::posix_thread::~posix_thread()':
CheckIncludeFile.cxx:(.text._ZN4asio6detail12posix_threadD2Ev[_ZN4asio6detail12posix_threadD5Ev]+0x26): undefined reference to `pthread_detach'
CMakeFiles/cmTC_1b98a.dir/CheckIncludeFile.cxx.o: In function `asio::detail::posix_thread::join()':
CheckIncludeFile.cxx:(.text._ZN4asio6detail12posix_thread4joinEv[_ZN4asio6detail12posix_thread4joinEv]+0x2b): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
make[1]: *** [CMakeFiles/cmTC_1b98a.dir/build.make:98: cmTC_1b98a] Error 1
make[1]: Leaving directory '/tmp/Simple-WebSocket-Server/build/CMakeFiles/CMakeTmp'
make: *** [Makefile:126: cmTC_1b98a/fast] Error 2

This seems to be a problem with cmake's CheckIncludeFileCXX though. I just confirmed this issue on Antergos. Temporary workaround:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b0ea16..8f31cb5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,11 +22,6 @@ target_link_libraries(simple-websocket-server INTERFACE ${CMAKE_THREAD_LIBS_INIT
 # Remove Boost system, thread, regex components; use Boost::<component> aliases; remove Boost target_include_directories
 if(USE_STANDALONE_ASIO)
     target_compile_definitions(simple-websocket-server INTERFACE USE_STANDALONE_ASIO)
-    include(CheckIncludeFileCXX)
-    CHECK_INCLUDE_FILE_CXX(asio.hpp HAVE_ASIO)
-    if(NOT HAVE_ASIO)
-        message(FATAL_ERROR "Standalone Asio not found")
-    endif()
 else()
     find_package(Boost 1.54.0 COMPONENTS system thread coroutine context REQUIRED)
     target_link_libraries(simple-websocket-server INTERFACE ${Boost_LIBRARIES})

Yeah, I ended up with the same workaround (although it should be temporary for sure since we're not checking if asio.hpp is present hence the compilation can start and fail if the library is not present for real).