在现有的Qt项目中从源代码构建第三方库

9
我的项目需要一个不在所有目标机器上都存在的zlib版本,因此我想从源代码构建zlib。然后,在编译我的项目时,它应该首先构建zlib,以便在编译我的项目时可以链接到它。
一个问题是,在运行make之前,需要运行configure来满足zlib的要求。
我甚至不知道从哪里开始。Qt Creator是否内置了导入第三方库源代码的功能,或者我需要编写自定义的.pro文件?
我尝试了右键单击我的项目时出现的“添加库...”菜单,但它无法识别库-可能是因为没有.pro文件。我还尝试通过“文件”-> “新建项目”-> “导入现有项目”创建.pro文件,一旦运行了configure,它就能够编译zlib,但仍然无法生成.pro文件。
我认为subdirs也许有用,但我不确定在这种情况下是否是正确的路线,即使是正确的路线,我也不确定是否可以自动创建必要的.pro文件,或者我必须自己创建。
给定第三方库(如zlib)的源代码,如何将其集成到现有的Qt项目中,以便可以从源代码编译该库并在我的项目中使用它?
3个回答

8

是的,你需要为此创建一个项目文件。您可以在下面找到我用于多个项目的版本。

zlib.pro

QT       -= core gui

TARGET = zlib
TEMPLATE = lib
# Use this for static zlib rather than the default dynamic
# CONFIG += staticlib
include(zlib.pri)

zlib.pri

HEADERS += \
    $$PWD/crc32.h \
    $$PWD/deflate.h \
    $$PWD/gzguts.h \
    $$PWD/inffast.h \
    $$PWD/inffixed.h \
    $$PWD/inflate.h \
    $$PWD/inftrees.h \
    $$PWD/trees.h \
    $$PWD/zconf.h \
    $$PWD/zlib.h \
    $$PWD/zutil.h

SOURCES += \
    $$PWD/adler32.c \
    $$PWD/compress.c \
    $$PWD/crc32.c \
    $$PWD/deflate.c \
    $$PWD/gzclose.c \
    $$PWD/gzlib.c \
    $$PWD/gzread.c \
    $$PWD/gzwrite.c \
    $$PWD/infback.c \
    $$PWD/inffast.c \
    $$PWD/inflate.c \
    $$PWD/inftrees.c \
    $$PWD/trees.c \
    $$PWD/uncompr.c \
    $$PWD/zutil.c

    INCLUDEPATH += $$PWD

然后在包含此文件的项目文件中,您可以像这样执行操作:

main.pro

# CONFIG += order # If you wanna make sure about order. This is optional.

SUBDIRS += \
    zlib \
    ...

如果您想更深入地使用qmake,可以这样做: ```` 如果你想更进一步使用qmake,可以像这样做: ````
SUBDIRS += \
    src_zlib \
    src_mylib \
    ...

src_zlib.subdir = $$PWD/zlib
src_zlib.target = sub-zlib
src_zlib.depends =

src_mylib.subdir = $$PWD/mylib
src_mylib.target = sub-mylib
src_mylib.depends = src_zlib

正如您所看到的,通过这种方式,无论设置的顺序如何,您都可以更合理地控制依赖项。例如,您仍然可以按字母顺序保留条目,这有助于长期维护。

然后,在您的子项目的项目文件(.pro)中,比如说“foo”,您需要添加类似以下的一行代码,以便依赖于zlib库。

foo.pro

LIBS += -L$${PROJECTROOT}/$${SUBDIR_TO_ZLIB} -lz

# These lines are only option, and you do not necessarily need them.
# win32:LIBNAME = zlib.dll
# unix:LIBNAME = libzlib.so
# PRE_TARGETDEPS += $${PROJECTROOT}/$${BUILD_SUBDIR_LIBS}/$${LIBNAME}

4
以下是将第三方库添加到Qt项目并从源代码构建的说明。
有些人可以通过Qt Creator添加这样的库,但我从未能使其正常工作。因此,这些是关于如何创建必要的.pro和.pri文件的说明。在本文中,我将以zlib为例,尽管其他库应该类似。
设置构建顺序
由于您的应用程序依赖于该库,因此我们需要确保先构建该库。为此,第三方库和“您的应用程序”的源代码应位于兄弟目录中。
~/myApp $ ls myApp
src zlib

您可能已经有一个正确构建应用程序的myApp.pro文件。我建议将其重命名为src.pro,您将在下一步看到为什么这样做。
mv src/myApp.pro src/src.pro

现在,您可以在根目录中创建一个新的myApp.pro文件。
~/myApp $ touch myApp.pro
~/myApp $ ls
myApp.pro src zlib

这是一个相当简单的.pro文件,仅仅是在告诉你“在构建myApp之前先构建zlib”,与此有关的更多信息请参见此处

# ~/myApp/myApp.pro
TEMPLATE = subdirs
CONFIG += ordered   # This tells Qt to compile the following SUBDIRS in order
SUBDIRS = zlib src

创建 Library .pro 文件

现在我们需要告诉 Qt 如何构建我们的第三方库。我们需要创建一个新的 .pro 文件:

# ~/myApp/zlib/zlib.pro
TARGET = z            # The name of the output library - can be whatever you want
TEMPLATE = lib        # Tells Qt that we are compiling a library so the output will be bundled into a .a or .so file
CONFIG += staticlib   # Tells Qt that we want a static library, so a .a file. Remove this and you will get a .so file

QMAKE_CFLAGS_WARN_ON -= -Wall   # Optional - disable warnings when compiling this library
QMAKE_CXXFLAGS_WARN_ON -= -Wall # Optional - disable warnings when compiling this library

HEADERS += \
    crc32.h \
    deflate.h \
    gzguts.h \
    inffast.h \
    inffixed.h \
    inflate.h \
    inftrees.h \
    trees.h \
    zconf.h \
    zlib.h \
    zutil.h

SOURCES += \
    adler32.c \
    compress.c \
    crc32.c \
    deflate.c \
    gzclose.c \
    gzlib.c \
    gzread.c \
    gzwrite.c \
    infback.c \
    inffast.c \
    inflate.c \
    inftrees.c \
    trees.c \
    uncompr.c \
    zutil.c

如果您正在构建除了 zlib 以外的其他内容,只需将 TARGET 更改为库的名称,并用需要编译的文件替换 HEADERSSOURCES 的内容即可。
现在,您可以测试这个 .pro 文件了。
~/myApp/zlib/ $ qmake
~/myApp/zlib/ $ make
...
~/myApp/zlib/ $ ls libz.a
libz.a

太好了!

将库链接到您的应用程序中

最后,我们需要更新您的应用程序的.pro文件,以链接第三方库。这有两个部分:

  1. 将库头文件添加到您的包含路径中,以便编译器可以从那里获取定义的符号。
  2. 在编译和链接时链接静态(或共享)库,以便适用的目标代码可以链接到您的应用程序中。

首先,我们将把头文件添加到包含路径中。将此行添加到src.pro中。

INCLUDEPATH += zlib

这样可以让你在代码中引用zlib.h,就像这样:
#include "zlib.h"

否则,您将不得不像这样指定头文件的完整相对路径:
#include "zlib/zlib.h"

如果你接受第二种方法,那么就不需要更新INCLUDEPATH变量。

其次,我们需要添加链接器需要找到静态(或共享)库本身的参数。将此行添加到src.pro中。

LIBS += -L$$PWD/../zlib -lz

第一部分(-L$$PWD/../zlib)表示包含库的文件夹位于../zlib,这应该是正确的,因为zlibsrc的兄弟文件夹。第二部分(-lz)表示库的名称为z。链接器从中推断出库实际上位于文件libz.a中。

完成

在此时,您可能需要通过执行make distclean来清理构建。但从那里开始,您应该能够通过进入基本目录并运行qmakemake来构建包括第三方库的项目。
cd ~/myApp
qmake -r
make

注:特别感谢@LaszloPapp启动了这个过程,本答案的许多源材料来自他的答案。


0

如果您正在使用QT Creator,您可以尝试调查“项目设置” ->“添加构建步骤” ->“自定义构建步骤”,然后在那里添加脚本文件。

这可以帮助在构建项目之前构建lib,然后您只需要将其链接到您的项目中。

我不确定,但很可能您可以将编译器设置作为参数传递给此脚本。我正在尝试解决它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接