如何创建可以从 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 的库的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 代码的库中调用 C 方法?

QT中能不能调用C语言的API。linux下的

如何从 Qt/C++ 的子函数中调用非静态父函数?

qt修正参数怎么调用自定义函数

VC调用QT封装的动态库,求详解

Qt中如何添加并调用别人在VC6.0写的的类文件?