在 Linux 上构建 Qt 共享库

Posted

技术标签:

【中文标题】在 Linux 上构建 Qt 共享库【英文标题】:Building Qt Shared library on Linux 【发布时间】:2014-11-28 20:54:03 【问题描述】:

我已按照以下链接中的说明进行操作(以及此处的一些主题) http://qt-project.org/doc/qt-4.8/sharedlibrary.html

我正在成功构建一个项目,但我只看到通常的对象和编译后的最终二进制文件。没有任何东西看起来像图书馆。

想法?

MyWidget_global.h

#ifndef MY_WIDGET_GLOBAL_H
#define MY_WIDGET_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MY_WIDGET_LIBRARY)
#  define MY_WIDGET_EXPORT Q_DECL_EXPORT
#else
#  define MY_WIDGET_IMPORT Q_DECL_IMPORT
#endif

#endif

项目文件

DEFINES += MY_WIDGET_LIBRARY

# Input
HEADERS += MyWidget_global.h \
            MyWidget.h
# Input
SOURCES += main.cpp \
            MyWidget.cpp

最后是实际类的标题

#ifndef MY_WIDGET_H
#define MY_WIDGET_H

#include "MyWidget_global.h"

class MY_WIDGET_EXPORT MyWidget

public:
    MyWidget();
    // Snip
;

#endif

【问题讨论】:

您的.pro 文件中有TEMPLATE = lib 吗? 我绝对不会。我周末下班回家,但周一会先尝试。谢谢。 :) 就是这样。谢谢。随意提供它作为答案,我会投票赞成。 【参考方案1】:

Qt 带有一系列预定义的项目模板。直接来自文档here:

TEMPLATE 变量用于定义将要构建的项目的类型。 如果这个没有在项目文件中声明qmake假定应该构建一个应用程序,并会生成一个合适的Makefile(或等效文件) 的目的。

因此,在您的情况下,QMake 假定要构建应用程序。添加正确的模板可以解决问题,即

TEMPLATE = lib

是解决方案。事实上,lib 是为库创建输出生成文件的正确模板。

请参阅here,了解如何正确创建库并将其添加到项目中。

【讨论】:

谢谢。我已经查看了该文档,但错过了。另外值得注意的是,当我想在 Windows 端链接一个静态库时,它必须是 TEMPLATE = staticlib(它同时构建 .dll 和 .a 库)。

以上是关于在 Linux 上构建 Qt 共享库的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 9.10 上使用 Qt 编译共享库

ubuntu下借助qt creator创建属于自己的共享库

无法在 qt creator (linux) 上链接共享库

cppcms - 共享库 - Linux

在 linux 中使用另一个共享库构建共享库

从一台主机到另一台主机的共享库路径不一致