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静态库
- 下载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
相关产品推荐
相关产品推荐

