如何在Qt项目中正确使用Golang导出的C共享库
步骤1:修正Go共享库的编译选项
首先根据你的链接需求选择对应编译指令:
- 静态链接(最终Qt程序无需附带额外dll):
go build -buildmode c-archive -o calcLib.a calcLib.go
- 动态链接(生成独立dll):
go build -buildmode c-shared -o calcLib.dll calcLib.go
编译完成后将生成的calcLib.a(静态库或动态库的导入库)、calcLib.h、动态编译场景下的calcLib.dll统一放到C:\Users\TCB13\shared目录下。
步骤2:修正C++头文件引入逻辑
calcLib.h是C语言风格的头文件,C++直接引入会触发函数名修饰逻辑导致找不到符号,需要用extern "C"包裹引入部分,修改main.cpp代码:
#include "testapp.h" #include <QApplication> #include <QtDebug> // 用extern "C"包裹C头文件引入,避免C++名字修饰 extern "C" { #include "calcLib.h" } int main(int argc, char *argv[]) { QApplication a(argc, argv); TestApp w; w.show(); qDebug() << Calculator(10,5); return a.exec(); }
步骤3:修正Qt .pro文件配置
你之前的LIBS语法存在错误:-L参数仅用于指定库搜索目录,-l才用于指定要链接的库名,同时静态链接Go库需要额外引入Go runtime依赖的Windows系统库:
INCLUDEPATH += "C:\Users\TCB13\shared" # 静态链接版本配置 LIBS += -L"C:\Users\TCB13\shared" \ -lcalcLib \ -lws2_32 \ -lwinmm \ -luserenv # 动态链接版本仅需保留下面两行即可,无需引入系统库 # LIBS += -L"C:\Users\TCB13\shared" \ # -lcalcLib # 动态链接需要将calcLib.dll放到Qt编译输出的exe同目录下才能正常运行
额外注意事项
- 保证Go编译的库架构和Qt使用的编译器架构一致:比如Go编译的是64位架构,Qt也要使用64位的MinGW或MSVC编译器,32位同理,否则会出现链接不兼容问题。
- 如果使用MSVC编译器编译Qt项目,Go默认生成的.a库是MinGW格式无法直接识别,推荐使用动态编译的dll,配合MSVC的lib工具生成对应导入库即可正常链接。
内容的提问来源于stack exchange,提问作者TCB13
相关产品推荐
相关产品推荐

