如何创建可以从 C 调用的基于 Qt 的库
Posted
技术标签:
【中文标题】如何创建可以从 C 调用的基于 Qt 的库【英文标题】:How to create Qt-based Library That Can Be Called from C 【发布时间】:2011-12-30 13:26:45 【问题描述】:我正在尝试构建一个简单的库,它使用 Qt 的一些功能(没有事件循环,只是一些图像操作和文件加载),然后从标准的 C
程序调用该库。我已经查看了答案here,但答案没有为我提供足够的信息来解决问题。我已经将该库构建为要链接的静态库,并用extern "C"
包装了函数调用,但我得到了一堆错误,从/usr/include/QtCore/qnamespace.h:-1: In function ‘QT_MODULE’:/usr/include/QtCore/qnamespace.h:54: error: unknown type name ‘namespace’.
开始
有人有关于从C
程序链接到 Qt 库的简短教程吗?仅供参考,一切都在 Linux (Fedora 15) 下,C
程序和 Qt 库都是用QtCreator
构建的。
【问题讨论】:
您是否尝试从 C 标头中包含 C++ 标头?那是行不通的。 您不能简单地将 Qt 头文件包含在您的 C 程序中。您需要将数据类型和类包装在您自己的结构中,或者按照链接答案中的建议使用void *
。
与此相关:wrap a c++ library in c? (don't “extern c”)
您链接的答案说您必须提供自己的功能才能访问 QT 功能。你做到了吗?
【参考方案1】:
假设您想创建一个用于创建和删除QImage
的包装器,可以这样做:
在你的头文件中:
typedef void *my_qimage_t;
extern "C" my_qimage_t my_create_qimage(int width, int height);
extern "C" void my_delete_qimage(my_qimage_t image);
在你的源文件中:
extern "C" my_qimage_t my_create_qimage(int width, int height)
QImage *qimage = new Qimage(width, height);
return static_cast<my_qimage_t>(qimage);
extern "C" void my_delete_qimage(my_qimage_t image);
QImage *qimage = static_cast<QImage *>(image);
delete qimage;
从调用者的角度来看,my_qimage_t
类型是一个黑盒子。所有的操作都必须通过你的库,通过传递这个不透明的指针来完成。
【讨论】:
或者您可以在 C 头文件中声明struct QImage;
,并避免所有这些类型定义和不安全的强制转换。以上是关于如何创建可以从 C 调用的基于 Qt 的库的主要内容,如果未能解决你的问题,请参考以下文章