CMake解决接口库引发的mqtt_init未定义引用问题
解决
mqtt_init未定义引用的链接错误 一、先修复代码语法错误
这些语法问题会先导致编译失败,或间接引发链接问题:
- 修正头文件声明:
projec/subproject/dll/mqtt/DLL_MQTT.h中补全函数返回类型,规范extern用法:
extern void mqtt_init(void);
- 修正实现文件:
project/src/mqtt/src/mqtt_impl.c去掉定义时的extern,补全返回类型和#include的#号:
#include "DLL_MQTT.h" void mqtt_init(void){ //Actual implementation of mqtt_init() }
- 修正调用文件:
subproject/src/logic.c补全#include的#号和函数返回类型:
#include "DLL_MQTT.h" void foo(){ mqtt_init(); //Call function from mqtt lib }
二、修复CMake配置核心问题
链接错误的本质是调用mqtt_init的SubProjLogic库未关联到实现该函数的MQTTClient库,同时主程序存在库名错误,具体修正:
- 子项目CMake修正:修改
subproject/CMakeLists.txt,让SubProjLogic直接链接到MQTTClient库:
cmake_minimum_required(VERSION 3.5.0) set(srcs ./src/logic.c) add_library(SubProjLogic STATIC "${srcs}") target_include_directories(SubProjLogic PUBLIC ./include) set_target_properties(SubProjLogic PROPERTIES LINKER_LANGUAGE C) # 新增:关联实现mqtt_init的MQTTClient库 target_link_libraries(SubProjLogic My_DLL MQTTClient)
- 主程序CMake修正:修改
project/CMakeLists.txt,修正库名错误并关联SubProjLogic(如果主程序用到该库的话):
cmake_minimum_required(VERSION 3.5.0) project(myProject VERSION 0.1.0 LANGUAGES C CXX) # Software components and wrappers for DLL implementation add_subdirectory(./src/mqtt) # subproject add_subdirectory(${PROJECT_SOURCE_DIR}/subproject) add_executable(myProject ./src/main.c ) target_link_libraries(myProject MQTTClient # 修正:原mqtt是错误的库名 SubProjLogic # 主程序用到SubProjLogic时必须添加 My_DLL )
三、关键原理
静态库不会自动解析外部依赖符号,只有当最终可执行文件链接时,所有依赖的静态库都被引入,链接器才能找到符号实现。SubProjLogic调用了mqtt_init,必须让它直接或间接关联到包含该函数实现的MQTTClient库,才能让链接器匹配到对应符号。
内容的提问来源于stack exchange,提问作者ddomnik
相关产品推荐
相关产品推荐

