Import websocketpp for cmake in VS2017

3.3k Views Asked by At

I am trying to import websocket++ to my project in Visual Studio 2017, but I have got a lot of errors with using it.

Project structure:

MyProject
  - src
    - websocketpp
    CMakeLists.txt
    echo_server.cpp

My CMakeLists.txt looks like:

cmake_minimum_required(VERSION 3.5)
project(MyProject)

include_directories(${PROJECT_SOURCE_DIR}/websocketpp)

add_executable(MyProject echo_server.cpp)

echo_server.cpp looks like:

#include "websocketpp/config/asio_no_tls.hpp"

#include "websocketpp/server.hpp"

#include <iostream>

typedef websocketpp::server<websocketpp::config::asio> server;

using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

// pull out the type of messages sent by our config
typedef server::message_ptr message_ptr;

// Define a callback to handle incoming messages
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg) {
    std::cout << "on_message called with hdl: " << hdl.lock().get()
              << " and message: " << msg->get_payload()
              << std::endl;

    // check for a special command to instruct the server to stop listening so
    // it can be cleanly exited.
    if (msg->get_payload() == "stop-listening") {
        s->stop_listening();
        return;
    }

    try {
        s->send(hdl, msg->get_payload(), msg->get_opcode());
    } catch (websocketpp::exception const & e) {
        std::cout << "Echo failed because: "
                  << "(" << e.what() << ")" << std::endl;
    }
}

int main() {
    // Create a server endpoint
    server echo_server;

    try {
        // Set logging settings
        echo_server.set_access_channels(websocketpp::log::alevel::all);
        echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);

        // Initialize Asio
        echo_server.init_asio();

        // Register our message handler
        echo_server.set_message_handler(bind(&on_message,&echo_server,::_1,::_2));

        // Listen on port 9002
        echo_server.listen(9002);

        // Start the server accept loop
        echo_server.start_accept();

        // Start the ASIO io_service run loop
        echo_server.run();
    } catch (websocketpp::exception const & e) {
        std::cout << e.what() << std::endl;
    } catch (...) {
        std::cout << "other exception" << std::endl;
    }
}

Errors:

Severity Code Description Project File Line Suppression State Error (active) E1696 cannot open source file "websocketpp/config/core.hpp" MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\websocketpp\config\asio_no_tls.hpp 31
Error (active) E1696 cannot open source file "websocketpp/transport/asio/endpoint.hpp" MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\websocketpp\config\asio_no_tls.hpp 32
Error (active) E1696 cannot open source file "websocketpp/roles/server_endpoint.hpp" MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\websocketpp\server.hpp 31
Error (active) E0283 qualified name is not allowed MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 7
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 7
Error (active) E0276 name followed by '::' must be a class or namespace name MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 9
Error (active) E0276 name followed by '::' must be a class or namespace name MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 10
Error (active) E0276 name followed by '::' must be a class or namespace name MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 11
Error (active) E0276 name followed by '::' must be a class or namespace name MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 14
Error (active) E0070 incomplete type is not allowed MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 17
Error (active) E0020 identifier "server" is undefined MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 17
Error (active) E0020 identifier "s" is undefined MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 17
Error (active) E0018 expected a ')' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 17
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 17
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 43
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 43
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 44
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 44
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 47
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 47
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 50
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 50
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 53
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 53
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 56
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 56
Error (active) E0077 this declaration has no storage class or type specifier MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 59
Error (active) E0065 expected a ';' MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 59
Error (active) E0169 expected a declaration MyProject - x64-Debug (default) G:_Development\Projects\MyProject\src\echo_server.cpp 60
Error C1083 Cannot open include file: 'websocketpp/config/core.hpp': No such file or directory C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\src\CMakeLists.txt g:_development\projects\myproject\src\websocketpp\config\asio_no_tls.hpp 31

What is wrong? please help.

1

There are 1 best solutions below

5
Guillaume Racicot On

Reading the implementation of websocketpp, importing it into your project should be quite simple.

Start by downloading websocketpp and install it:

git clone https://github.com/zaphoyd/websocketpp.git && cd websocketpp
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=some/known/path ..
cmake --build . --target install

Do not forget the .. in the command. It's the relative path to the source directory from the build directory.

The some/known/path can be a global path on your machine, in the user's directory or even inside a specific directory in your project.

Also, since this library export the package into the user's package registry, you can skip the install and let cmake import the build tree as the package itself. I usually find installing them to be cleaner however.

cmake --build .

Then inside your project:

cmake_minimum_required(VERSION 3.5)
project(MyProject)

find_package(websocketpp REQUIRED)

add_executable(MyProject echo_server.cpp)

# Link include directories, libraries, defines etc.
target_link_libraries(MyProject PUBLIC websocketpp::websocketpp)

You can then invoke cmake like this:

# inside your-project/build
cmake -DCMAKE_PREFIX_PATH=some/known/path ..