2

标题说明了问题陈述:我正在尝试使用libwebsocket 库创建一个 CMake 项目,但我找不到任何这样做的信息。

有没有人试过这个?一个简单的 CMakeLists.txt 例如测试服务器程序将不胜感激!

我已经在我的 Ubuntu 14.04 机器上编译并安装了这个库。

编辑:我还想知道是否有人有使用带有 C++ 的 libwebsocket 库的经验?

编辑 2: 使用@evadeflow 的答案后,我可以运行 cmake 并构建项目。但是现在我收到以下运行时错误:

在此处输入图像描述

ls/usr/local/lib/文件夹

在此处输入图像描述

好像libwebsockets.so.7找不到文件?

来自 CMake:

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

编辑 3:

通过以下方式解决了编辑 2:编辑文件/etc/ld.so.conf并添加/usr/local/lib.

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

4

1 回答 1

4

如果你已经安装了libwebsockets,这样的东西应该可以工作:

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"
)

这基本上是libwebsockets github 项目中CMakeLists.txt文件中内容的精简版本,没有所有平台和构建特定的条件。

我希望这足以满足您对“简单”CMakeLists.txt示例的要求。我用 CMake 版本 2.8.12.2 对其进行了测试;如果您已将 libwebsockets 安装到其默认前缀/usr/local;它应该可以正常工作 但是,如果您安装到不同的位置,则需要在调用的环境中进行设置PKG_CONFIG_PATHcmake

此外,如CMake 文档中所述,如果您使用的是 CMake 2.8.11 或更早版本,则需要在调用中替换DIRECTORY为。PATHget_filename_component()

更新:关于后续评论中的文件未找到错误,这几乎可以肯定是由于libwebsocket.so[.7]不在链接器的默认路径上。至少有三种方法可以解决此问题,但验证问题是否存在的最简单方法是使用以下命令从终端启动应用程序:

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

如果它有效,您就知道这是问题所在。(哎呀-我看到您同时已经弄清楚了。是的,更新/etc/ld.so.conf是另一种方式。或者,您可以强制 CMake 链接到[as described in this answer]的静态版本是另一种方式。但我喜欢您的解决方案最好的。)libwebsockets

更新:没有提到的一件事/etc/ld.so.conf是您通常需要sudo /sbin/ldconfig在编辑后运行才能更新共享库缓存。而且——在为特定应用程序设置非默认路径时——许多人认为在其中添加新的“子配置文件”/etc/ld.so.conf.d而不是编辑全局 ldconfig 文件是一种很好的形式。(但是,对于添加 的情况/usr/local/lib,这是一个常见的要求,我倾向于将其转储到全局配置中,无论如何,这是许多 Linux 发行版所做的。)

于 2016-03-07T16:02:49.123 回答