You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

后续操作步骤

  1. 先清理之前的构建缓存,避免旧配置干扰:
    rm -rf CMakeCache.txt CMakeFiles/ bin/
    
  2. 重新运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:17:39