c++ - 使用 boost 库构建 socket.io C++

标签 c++ sockets boost socket.io cmake

伙计们,我在这里遇到了一个小问题。基本上,我正在尝试构建这个很棒的库 https://github.com/socketio/socket.io-client-cpp使用 CMake。

首先,我根据需要安装了 boost,它进入了 opt/local/include/boost 和 opt/local/lib。但问题是 CMake 找不到所需的 boost 库。在 Configure 之后,CMake 给了我那个日志:

not define build type, set to release
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.6/Modules/FindBoost.cmake:1753 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.59.0

  Boost include path: /opt/local/include

  Could not find the following static Boost libraries:

          boost_date_time
          boost_random

  Some (but not all) of the required Boost libraries were found.  You may
  need to install these additional Boost libraries.  Alternatively, set
  BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT
  to the location of Boost.
Call Stack (most recent call first):
  CMakeLists.txt:23 (find_package)

遇到这个问题后,我尝试手动设置 BOOST_LIBRARYDIR,但这也不起作用。

这是我尝试编译失败的库附带的 CMake 文件:

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
PROJECT(sioclient)

option(BUILD_SHARED_LIBS "Build the shared library" OFF)
option(Boost_USE_STATIC_LIBS "Use Boost static version" ON)

set(MAJOR 1)
set(MINOR 6)
set(PATCH 0)

if(NOT CMAKE_BUILD_TYPE )
MESSAGE(STATUS "not define build type, set to release" )
set(CMAKE_BUILD_TYPE Release )
elseif(NOT (${CMAKE_BUILD_TYPE} STREQUAL "Release" OR ${CMAKE_BUILD_TYPE} STREQUAL "Debug" ))
MESSAGE(SEND_ERROR "CMAKE_BUILD_TYPE must be either Release or Debug")
return()
endif()

set(BOOST_VER "1.55.0" CACHE STRING "boost version" )

set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost ${BOOST_VER} REQUIRED COMPONENTS system date_time random) 

aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src ALL_SRC)
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src/internal ALL_SRC)
file(GLOB ALL_HEADERS ${CMAKE_CURRENT_LIST_DIR}/src/*.h )
set(SIO_INCLUDEDIR ${CMAKE_CURRENT_LIST_DIR})

add_library(sioclient ${ALL_SRC})
target_include_directories(sioclient PRIVATE ${Boost_INCLUDE_DIRS} 
    ${CMAKE_CURRENT_LIST_DIR}/src 
    ${CMAKE_CURRENT_LIST_DIR}/lib/websocketpp 
    ${CMAKE_CURRENT_LIST_DIR}/lib/rapidjson/include
)

set_property(TARGET sioclient PROPERTY CXX_STANDARD 11)
set_property(TARGET sioclient PROPERTY CXX_STANDARD_REQUIRED ON)
target_link_libraries(sioclient PRIVATE ${Boost_LIBRARIES})
if(BUILD_SHARED_LIBS)
set_target_properties(sioclient
    PROPERTIES
        SOVERSION ${MAJOR}
        VERSION ${MAJOR}.${MINOR}.${PATCH}
    )
endif()
list(APPEND TARGET_LIBRARIES sioclient)

find_package(OpenSSL)
if(OPENSSL_FOUND)
add_library(sioclient_tls ${ALL_SRC})
target_include_directories(sioclient_tls PRIVATE ${Boost_INCLUDE_DIRS} 
    ${CMAKE_CURRENT_LIST_DIR}/src 
    ${CMAKE_CURRENT_LIST_DIR}/lib/websocketpp 
    ${CMAKE_CURRENT_LIST_DIR}/lib/rapidjson/include
    ${OPENSSL_INCLUDE_DIR}
)

set_property(TARGET sioclient_tls PROPERTY CXX_STANDARD 11)
set_property(TARGET sioclient_tls PROPERTY CXX_STANDARD_REQUIRED ON)
target_link_libraries(sioclient_tls PRIVATE ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} )
target_compile_definitions(sioclient_tls PRIVATE -DSIO_TLS)
if(BUILD_SHARED_LIBS)
set_target_properties(sioclient_tls
    PROPERTIES
        SOVERSION ${MAJOR}
        VERSION ${MAJOR}.${MINOR}.${PATCH}
    )
endif()
list(APPEND TARGET_LIBRARIES sioclient_tls)

endif()

install(FILES ${ALL_HEADERS} 
    DESTINATION "${CMAKE_CURRENT_LIST_DIR}/build/include"
)

install(TARGETS ${TARGET_LIBRARIES}
    DESTINATION "${CMAKE_CURRENT_LIST_DIR}/build/lib/${CMAKE_BUILD_TYPE}"
)

install(FILES ${Boost_LIBRARIES} 
    DESTINATION "${CMAKE_CURRENT_LIST_DIR}/build/lib/${CMAKE_BUILD_TYPE}"
)

我很感激这里的任何帮助,伙计们!还有一个观察:如果我没记错的话,它会尝试在 include 文件夹中找到名为 randomboost_random。也许这就是问题所在?

最佳答案

我想,您还没有构建 Boost 库的静态版本。

如果您使用 Boost.Build(b2 程序)构建了 Boost,那么您应该使用 link=static,shared 重新编译它(运行 b2 link=static,shared <other_flags> )设置标志,以便构建动态库和静态库。

upd:另外,这个项目的自述文件说你应该用 cmake -DBOOST_ROOT:STRING=/opt/local -DBOOST_VER:STRING=<your boost version> ./ 运行你的 CMake指定了适当的 Boost 版本。

关于c++ - 使用 boost 库构建 socket.io C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473458/

相关文章:

c++ - 使用类名的模板值作为指针

c++ - 对 OpenCV 图像表示感到困惑

php - PHP 的日志流过滤器?

c++ - split_interval_map用法,高效找到所有与一个点相交的区间

python - 在 mac 雪豹 macports 上 boost python 导入错误

c++ - 是否有比 Pro*C/C++ 更智能的 Oracle sql 预处理器?

c++ - 使用 Unicode 重命名文件

performance - 写入多个套接字连接的最快方法

c# - 将套接字事件包装为异步

c++ - 我如何强制 boost::asio 优先完成 async_write 调用而不是运行其他处理程序?