CMake交叉编译MQTT客户端时出现`MQTTClient_create`未定义引用问题
解决交叉编译Paho MQTT库后链接未定义引用的问题
看了你的问题描述和编译输出,核心问题出在CMake配置里的库链接部分——find_library的用法不对,导致编译器没法正确找到并链接你交叉编译好的libpaho-mqtt3c.so,所以才会出现一堆未定义引用的错误。
问题到底出在哪?
你现在写的find_library(LIB ${PROJECT_SOURCE_DIR}/lib)是错误的用法:find_library的第二个参数应该是库的名称(不带lib前缀和.so后缀),第三个参数才是搜索路径。你直接把路径传进去,变量LIB根本没拿到正确的库文件路径,链接阶段自然找不到那些MQTT相关的函数符号。
另外,那个STAGING_DIR未定义的警告是OpenWRT交叉编译环境的常规提示,但不是导致链接失败的直接原因,先解决库链接的问题,这个警告可以后续再处理。
修正后的CMakeLists.txt
把你的CMake配置改成下面这样,就能正确链接库了:
cmake_minimum_required(VERSION 3.16) project(CPE LANGUAGES C) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER ${PROJECT_SOURCE_DIR}/toolchain/bin/arm-openwrt-linux-uclibcgnueabi-gcc) set(CMAKE_CXX_COMPILER ${PROJECT_SOURCE_DIR}/toolchain/bin/arm-openwrt-linux-uclibcgnueabi-g++) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 引入Paho MQTT的头文件目录 include_directories(${PROJECT_SOURCE_DIR}/include) # 指定要编译的源文件 set(SRC_LIST ${PROJECT_SOURCE_DIR}/src/pub.c) # 查找paho-mqtt3c库,明确指定搜索路径 find_library(PAHO_MQTT_LIB NAMES paho-mqtt3c PATHS ${PROJECT_SOURCE_DIR}/lib) # 如果找不到库,直接报错提示,避免后续编译失败 if(NOT PAHO_MQTT_LIB) message(FATAL_ERROR "没在${PROJECT_SOURCE_DIR}/lib目录找到paho-mqtt3c库!") endif() # 生成可执行文件并链接找到的库 add_executable(pub ${SRC_LIST}) target_link_libraries(pub ${PAHO_MQTT_LIB})
后续操作步骤
- 先清理之前的构建缓存,避免旧配置干扰:
rm -rf CMakeCache.txt CMakeFiles/ bin/ - 重新运行cmake和make:
cmake . make
如果还是有问题,你可以先试试直接指定库的绝对路径来链接(临时调试用):
target_link_libraries(pub ${PROJECT_SOURCE_DIR}/lib/libpaho-mqtt3c.so)
至于STAGING_DIR的警告,你可以在运行cmake前先设置环境变量:
export STAGING_DIR=/你的openwrt staging目录路径
或者直接在CMakeLists里添加一行:
set(ENV{STAGING_DIR} "/你的openwrt staging目录路径")
内容的提问来源于stack exchange,提问作者Ashechol
相关产品推荐
相关产品推荐

