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

Win10下Mosquitto通过CMake静态链接失败问题求助

链接静态Mosquitto库时出现LNK2019未解析外部符号错误

构建基于CMake的Mosquitto最小项目时,链接mosquitto_static.lib出现以下错误:

msqTest.obj : error LNK2019: unresolved external symbol __imp_mosquitto_lib_init referenced in function main 

所有Mosquitto库函数调用均报此类错误。

操作步骤

编译Mosquitto静态库

  1. 下载Mosquitto源码后执行编译:
mkdir build/win
cd build/win
cmake ../..
cmake --build . --config Release

编译正常完成,生成了mosquitto_static.lib,且已开启静态库编译选项:

option(WITH_STATIC_LIBRARIES "Build static versions of the libmosquitto/pp libraries?" ON)

构建测试项目

测试项目执行以下构建命令:

mkdir build
cd build
cmake ..
cmake --build . --config Release

项目文件内容

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Test VERSION 1.99)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)

if (WIN32)
    add_definitions("-DNOMINMAX")               # Remove collision of windows.h and std:: min() and max() functions
    add_definitions("-D_TIMESPEC_DEFINED")      # Remove collision of timespec in mosquitto and pthread
    add_definitions(/MP)                        # Multithreading build
    # add_definitions("-DWINDOWS_EXPORT_ALL_SYMBOLS")
    # add_definitions(/NODEFAULTLIB:library)      # Remove library type collisions
endif()

add_executable(Test msqTest.cpp)

# add_subdirectory(mosquitto)

target_include_directories(Test PUBLIC
    # New local download
    "${CMAKE_CURRENT_SOURCE_DIR}/mosquitto/include"      # Contains mosquitto.h
)


target_link_libraries(Test PUBLIC
    # New local build
    "${CMAKE_CURRENT_SOURCE_DIR}/mosquitto/build/win/lib/Release/mosquitto_static.lib"
)

msqTest.cpp

#include <stdlib.h>
#include <stdio.h>
extern "C" {
#include "mosquitto.h"
}

int main(int argc, char *argv[])
{
    int rc;
    struct mosquitto_message *msg;

    mosquitto_lib_init();

    rc = mosquitto_subscribe_simple(
            &msg, 1, true,
            "irc/#", 0,
            "test.mosquitto.org", 1883,
            NULL, 60, true,
            NULL, NULL,
            NULL, NULL);

    if(rc){
        printf("Error: %s\n", mosquitto_strerror(rc));
        mosquitto_lib_cleanup();
        return rc;
    }

    printf("%s %s\n", msg->topic, (char *)msg->payload);
    mosquitto_message_free(&msg);

    mosquitto_lib_cleanup();


    system("pause");
    return 0;
}

项目目录结构

testMosquitto
├── CMakeLists.txt
├── msqTest.cpp
├── build
│   ├── build stuff
├── mosquitto (downloaded)
│   ├── CMakeLists.txt
│   ├── entire mosquitto repository
│   ├── build
│   │   ├── win
│   │   │   ├── build stuff

疑问

不确定如何让链接器识别静态库中的函数,是否需要将这些函数设置为公开?


内容的提问来源于stack exchange,提问作者Malle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:50:28