我是 CMake 和 C++ 初学者,正在尝试创建一个基于 C++ 的 MQTT 客户端库。我的库依赖于另外两个库,
PahoMqttCpp::paho-mqtpp3
和 nlohmann_json::nlohmann_json
。
在这两个库中,我希望 json 库能够
PUBLIC
链接,因为 json-objects 是客户端 API 的一部分。另一方面,我不希望项目的用户访问或修改我正在使用的内部 PahoMqttCpp
客户端,因此我想私下链接它(如果我正确理解 PUBLIC
和 PRIVATE
链接)。
这是我的
CMakeLists.txt
的粗略娱乐:
# ...Project and library initialization
find_package(PahoMqttCpp REQUIRED)
find_package(nlohmann_json REQUIRED)
target_link_libraries(MQTTClient
PRIVATE PahoMqttCpp::paho-mqttpp3
PUBLIC nlohmann_json::nlohmann_json
)
include(GNUInstallDirs)
install(TARGETS MQTTClient
EXPORT MQTTClientTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT MQTTClientTargets
FILE MQTTClientTargets.cmake
NAMESPACE MQTTClient::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MQTTClient
)
include(CMakePackageConfigHelpers)
configure_package_config_file(
cmake/MQTTClientConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/WaraPSClientConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/WaraPSClient
)
write_basic_package_version_file(
MQTTClientConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MQTTClientConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/MQTTClientConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MQTTClient
)
还有一个非常基本的
MQTTClientConfig.cmake.in
文件。这可以正确构建和链接,并且我可以使用 cmake 安装该库,但是,当我尝试在另一个带有 CMakeLists.txt
的项目中使用它时,如下所示:
cmake_minimum_required(VERSION 3.7...3.29)
project(Test)
add_executable(Test src/main.cc)
find_package(MQTTClient)
target_link_libraries(Test MQTTClient)
尝试链接可执行文件时出现以下错误:
/usr/bin/ld: /usr/local/lib/libMQTTClient.so: undefined reference to `mqtt::properties::properties()'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/Test.dir/build.make:97: Test] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/Test.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2
我一生都无法弄清楚为什么这不起作用,我在两天的大部分时间里都被这个错误困扰,任何帮助将不胜感激。
我在一段时间后设法解决了这个问题,问题与 CMake 无关,而是源于错误的
apt
下载。从头开始重新安装 mqtt 库后,我成功地编译了所有内容。