9

我的项目需要一个zlib并非所有目标机器上都存在的版本,所以我想zlib在我的项目中从源代码构建。然后当我make我的项目时,它应该首先构建zlib,以便在编译我的项目时可以链接到它。

一个复杂的问题是zlib需要configure先运行才能make运行。

我什至不知道从哪里开始。Qt Creator 中是否内置了用于导入这样的第 3 方库源代码的功能,或者我是否需要编写自定义.pro文件?

我尝试了右键单击我的项目时出现的“添加库...”菜单,但它无法识别库 - 可能是因为不.pro存在文件。我也尝试.pro通过 File -> New Project -> Import Existing Project 创建一个文件,运行zlib一次configure就可以编译,但还是不生成.pro文件。

我认为子目录可能有用,但我不确定在这种情况下这是否是正确的路线,即使我不确定是否可以自动创建必要的.pro文件,或者我必须创建我自己。

给定 3rd 方库之类的源代码zlib,我如何将其集成到现有的 Qt 项目中,以便我可以从源代码编译库,并在我的项目中使用它?

4

3 回答 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

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

主程序

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

SUBDIRS += \
    zlib \
    ...

如果你想更高级地使用 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}
于 2013-09-05T22:21:25.790 回答
4

以下是向您的 Qt 项目添加 3rd 方存储库并从源代码构建它的说明。

有些人可以通过 Qt Creator 添加这样的库,但我永远无法让它工作。因此,这些是有关如何创建必要文件.pro的说明。.pri在这篇文章中,我将zlib用作示例,尽管其他库应该类似。

设置构建顺序

由于您的应用程序依赖于该库,因此我们需要确保首先构建该库。为此,您的应用程序的第 3 方库和源代码应位于同级目录中。

~/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文件,只是“构建zlib之前myApp”。

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

创建库 .pro 文件

现在我们需要告诉 Qt 如何构建我们的 3rd 方库。我们通过创建一个新.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库的名称,并将 和 的内容替换为HEADERS需要SOURCES为您的库编译的文件。

您现在可以继续测试此.pro文件。

~/myApp/zlib/ $ qmake
~/myApp/zlib/ $ make
...
~/myApp/zlib/ $ ls libz.a
libz.a

耶!

将库链接到您的应用程序

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

  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,这应该是正确的,因为zlib它是 的同级文件夹src。第二部分 ( -lz) 表示库的名称是z. 链接器由此推断该库实际上位于文件中libz.a

完毕

此时,您可能必须通过执行make distclean. 但是从那里您应该能够使用包含的 3rd 方库构建您的项目,方法是转到您的基本目录并qmake运行make.

cd ~/myApp
qmake -r
make

注意:非常感谢 @LaszloPapp 让这个过程开始。这个答案的大部分原始资料来自他的回答。

于 2013-09-09T16:14:18.843 回答
0

或者,如果您使用的是 QT Creator,您可以尝试调查“项目设置”->“添加构建步骤”->“自定义构建步骤”并在那里添加脚本文件。这可能有助于在之前构建 lib,然后您只需要将其链接到您的项目。

我不确定,但很可能您可以将编译器设置像参数一样传递给该脚本。我现在正在努力解决它。

于 2019-12-25T11:33:00.883 回答