2

The title states the problem statement: I'm trying to create a CMake project utilizing the libwebsocket library, but I can't find any information for doing so.

Is there anyone who have tried this? A simple CMakeLists.txt for e.g. the test-server program would be much appreciated!

I've compiled and installed the library on my Ubuntu 14.04 machine.

EDIT: I would also like to know if anyone has experience in using the libwebsocket lib w/ C++?

EDIT 2: After using @evadeflow's answer I'm able to run cmake and build the project. However now I get the following runtime error:

enter image description here

And here's an ls of the /usr/local/lib/ folder

enter image description here

It seems like the libwebsockets.so.7 file is not found?

From CMake:

  • ${LIB_WEBSOCKETS_INCLUDE_DIRS} = /usr/local/lib
  • ${LIB_WEBSOCKETS_INSTALL_DIR} = /usr/local

EDIT 3:

Solved edit 2 by: Editing the file /etc/ld.so.conf and add /usr/local/lib.

Reference: https://lonesysadmin.net/2013/02/22/error-while-loading-shared-libraries-cannot-open-shared-object-file/

1 Answers1

4

If you've already installed libwebsockets, something like this ought to work:

cmake_minimum_required(VERSION 2.8)

find_package(PkgConfig)
pkg_check_modules(LIB_WEBSOCKETS REQUIRED libwebsockets)

get_filename_component(
  LIB_WEBSOCKETS_INSTALL_DIR
  ${LIB_WEBSOCKETS_LIBRARY_DIRS}
  DIRECTORY
)

add_executable(
    test-server
      test-server/test-server.c
      test-server/test-server-http.c
      test-server/test-server-dumb-increment.c
      test-server/test-server-mirror.c
      test-server/test-server-status.c
      test-server/test-server-echogen.c
)

target_link_libraries(
    test-server
      ${LIB_WEBSOCKETS_LIBRARIES}
)

set_target_properties(
    test-server
    PROPERTIES
      INCLUDE_DIRECTORIES
        ${LIB_WEBSOCKETS_INCLUDE_DIRS}
      LINK_FLAGS
        "-L${LIB_WEBSOCKETS_LIBRARY_DIRS}"
      COMPILE_DEFINITIONS
        INSTALL_DATADIR="${LIB_WEBSOCKETS_INSTALL_DIR}/share"
)

This is basically a stripped-down version of what's in the CMakeLists.txt file from the libwebsockets github project, without all the platform- and build-specific conditionals.

I hope this is enough to satisfy your request for a 'simple' CMakeLists.txt example. I tested it with CMake version 2.8.12.2; it should work fine as-is if you've installed libwebsockets to its default prefix of /usr/local; however, if you installed to a different location, you will need to set PKG_CONFIG_PATH in the environment from which you invoke cmake.

Also, as explained in the CMake documentation, you will need to replace DIRECTORY with PATH in the get_filename_component() invocation if you're using CMake 2.8.11 or earlier.

UPDATE: Regarding the file not found error from your follow-up comment, this is almost certainly due to libwebsocket.so[.7] not being on the linker's default path. There are at least three ways to fix this, but the easiest way to verify that this is the problem would be to just launch the app from the terminal using:

$ LD_LIBRARY_PATH=/usr/local/lib ./test-server

If it works, you know that was the issue. (Oops—I see you've figured it out in the meantime. Yeah, updating /etc/ld.so.conf is another way. Or, you can force CMake to link to the static version of libwebsockets [as described in this answer] is another. But I like your solution best.)

UPDATE: One thing that wasn't mentioned about /etc/ld.so.conf is that you generally need to run sudo /sbin/ldconfig after editing it in order to update the shared library cache. And—when setting non-default paths for a particular application—many people consider it good form to add a new 'sub-config file' in /etc/ld.so.conf.d rather than edit the global ldconfig file. (For the case of adding /usr/local/lib, though, this is such a common requirement I'd be inclined to dump it in the global config, which is what lots of Linux distros do, anyway.)

Community
  • 1
  • 1
evadeflow
  • 4,704
  • 38
  • 51