【问题标题】:Link PahoMqttCpp as a static library in CMake using Conan使用柯南将 PahoMqttCpp 链接为 CMake 中的静态库
【发布时间】:2021-09-07 08:38:31
【问题描述】:

我正在开发一个 C++ Web 框架 oatpp 来创建 REST API。使用oatpp-starter 项目,其中CMakeLists.txt 看起来像:

cmake_minimum_required(VERSION 3.1)

set(project_name my-project) ## rename your project here

project(${project_name})

set(CMAKE_CXX_STANDARD 11)

add_library(${project_name}-lib
        src/AppComponent.hpp
        src/controller/MyController.cpp
        src/controller/MyController.hpp
        src/dto/DTOs.hpp
)

## link libs

find_package(oatpp 1.2.5 REQUIRED)

target_link_libraries(${project_name}-lib
        PUBLIC oatpp::oatpp
        PUBLIC oatpp::oatpp-test
)

target_include_directories(${project_name}-lib PUBLIC src)

## add executables

add_executable(${project_name}-exe
        src/App.cpp
        test/app/MyApiTestClient.hpp)
target_link_libraries(${project_name}-exe ${project_name}-lib)
add_dependencies(${project_name}-exe ${project_name}-lib)

add_executable(${project_name}-test
        test/tests.cpp
        test/app/TestComponent.hpp
        test/app/MyApiTestClient.hpp
        test/MyControllerTest.cpp
        test/MyControllerTest.hpp
)

target_link_libraries(${project_name}-test ${project_name}-lib)
add_dependencies(${project_name}-test ${project_name}-lib)

set_target_properties(${project_name}-lib ${project_name}-exe ${project_name}-test PROPERTIES
        CXX_STANDARD 11
        CXX_EXTENSIONS OFF
        CXX_STANDARD_REQUIRED ON
)

enable_testing()
add_test(project-tests ${project_name}-test)

编译此代码后我得到的可执行文件在具有相同架构的容器中成功运行。但是当我将paho-mqtt 库添加到项目中时,可执行文件不会在容器上运行,因为the shared library libpaho-mqttcpp3.so.1 not found: No such file or directory 错误。

我正在使用此配置添加库: 更新CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

set(project_name my-project) ## rename your project here

project(${project_name})

set(CMAKE_CXX_STANDARD 11)

add_library(${project_name}-lib
        src/AppComponent.hpp
        src/controller/MyController.cpp
        src/controller/MyController.hpp
        src/dto/DTOs.hpp
)

## link libs

find_package(oatpp 1.2.5 REQUIRED)

target_link_libraries(${project_name}-lib
        PUBLIC oatpp::oatpp
        PUBLIC oatpp::oatpp-test
)


## conan
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

target_include_directories(${project_name}-lib PUBLIC src)

## add executables

add_executable(${project_name}-exe
        src/App.cpp
        test/app/MyApiTestClient.hpp)
target_link_libraries(${project_name}-exe ${project_name}-lib ${CONAN_LIBS})
add_dependencies(${project_name}-exe ${project_name}-lib)

add_executable(${project_name}-test
        test/tests.cpp
        test/app/TestComponent.hpp
        test/app/MyApiTestClient.hpp
        test/MyControllerTest.cpp
        test/MyControllerTest.hpp
)

target_link_libraries(${project_name}-test ${project_name}-lib ${CONAN_LIBS})
add_dependencies(${project_name}-test ${project_name}-lib)

set_target_properties(${project_name}-lib ${project_name}-exe ${project_name}-test PROPERTIES
        CXX_STANDARD 11
        CXX_EXTENSIONS OFF
        CXX_STANDARD_REQUIRED ON
)

enable_testing()
add_test(project-tests ${project_name}-test)

这是conanfile.txt

[requires]
paho-mqtt-cpp/1.2.0     # MQTT Client

[generators]
cmake

如何配置 CMake 以使用柯南下载的 PahoMqttCpp 库来构建独立项目可执行文件(使用静态库)

【问题讨论】:

  • 请分享您的 conanfile 和整个日志。仅阅读您的症状,似乎已安装了 oatpp,但无法确定它是从系统还是从柯南获取库目录。
  • 我正在发布我的 conanfile 并回答我的解决方案,因为我想通了。 TLDR;而不是安装 oatpp,并为 mqtt 客户端使用 conan,而是将 cmake 配置为使用 conan,然后使用 conan 提供的库。

标签: c++ cmake paho conan


【解决方案1】:

这就是发生的事情: 我错误地将CMakeLists.txt 配置为与conan 集成。由于我事先安装了paho-mqtt-cpp,因此该程序链接到已安装的库,而不是柯南提供的库。

这个CMakeLists.txt 为我工作:

cmake_minimum_required(VERSION 3.1)
set(PROJECT_NAME my-awesome-project)
project(${PROJECT_NAME})

set(CMAKE_CXX_STANDARD 14)

############################### CONAN SETUP BEGIN ##########################################
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
    message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
    file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.9/conan.cmake"
            "${CMAKE_BINARY_DIR}/conan.cmake")
endif()
include(${CMAKE_BINARY_DIR}/conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt BASIC_SETUP)
############################### CONAN SETUP END ############################################

add_library(${PROJECT_NAME}-lib
        # controllers
        src/controller/StaticController.hpp

        # db
        src/db/DemoDb.hpp

        # mqtt
        src/mqtt/MqttCoroutine.hpp
        src/mqtt/MqttClient.hpp

        # dto
        src/dto/PageDto.hpp
        src/dto/StatusDto.hpp
        src/dto/DemoDto.hpp

        # services
        src/service/DemoService.cpp
        src/service/DemoService.hpp

        # base
        src/AppComponent.hpp
        src/DatabaseComponent.hpp
        src/ErrorHandler.cpp
        src/ErrorHandler.hpp)

## include directories
target_include_directories(${PROJECT_NAME}-lib PUBLIC src)


add_definitions(
        ## SQLite database file
        -DDATABASE_FILE="${CMAKE_CURRENT_SOURCE_DIR}/sql/db.sqlite"

        ## SQLite database test file
        -DTESTDATABASE_FILE="${CMAKE_CURRENT_SOURCE_DIR}/sql/test-db.sqlite"

        ## Path to database migration scripts
        -DDATABASE_MIGRATIONS="${CMAKE_CURRENT_SOURCE_DIR}/sql"

        ## my-awesome-project Service
        -DHOST="0.0.0.0"
        -DPORT=8080

        ## MQTT Broker
        -DMQTT_BROKER_URL="tcp://127.0.0.1:1883"
)

if(CMAKE_SYSTEM_NAME MATCHES Linux)
    find_package(Threads REQUIRED)
    target_link_libraries(${PROJECT_NAME}-lib INTERFACE Threads::Threads ${CMAKE_DL_LIBS})
endif()

## add executables
add_executable(${PROJECT_NAME}-exe src/App.cpp)
target_link_libraries(${PROJECT_NAME}-exe ${PROJECT_NAME}-lib ${CONAN_LIBS})

add_executable(${PROJECT_NAME}-test
        test/tests.cpp
        test/app/TestClient.hpp
        test/app/TestDatabaseComponent.hpp
        test/app/TestComponent.hpp
        test/DeviceControllerTest.hpp
        test/DeviceControllerTest.cpp)

target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}-lib ${CONAN_LIBS})

enable_testing()
add_test(e2e-tests ${PROJECT_NAME}-test)

连同这个conanfile.txt

[requires]
oatpp/1.2.5             # REST library
oatpp-sqlite/1.2.5      # SQLite3 plugin
paho-mqtt-cpp/1.2.0     # MQTT Client

[generators]
cmake

只需使用常规的cmake 命令生成Makefile。然后运行make 获取可执行文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2021-12-15
    • 2023-03-11
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多