Cor*_*ein 9 c++ qt qmake zlib qt-creator
我的项目需要zlib在所有目标计算机上都没有的版本,所以我想zlib在我的项目中从源代码构建.然后,当make我的项目,它应该首先构建,zlib以便它可以链接到编译我的项目时.
一个复杂因素是zlib需要configure在运行之前make运行.
我甚至不确定从哪里开始.Qt Creator是否内置了导入第三方库源代码的功能,或者我是否需要编写自定义.pro文件?
我尝试右键单击我的项目时出现的"添加库..."菜单,但它无法识别库 - 可能是因为没有.pro文件存在.我还尝试.pro通过File  - > New Project  - > Import Existing Project 创建一个文件,它可以编译zlib一次configure已运行,但它仍然不生成.pro文件.
我认为也许子目录可能有用,但我不确定在这种情况下这是否是正确的路线,即使它是我不确定我是否可以自动创建必要的.pro文件,或者我必须创建我自己.
鉴于第三方库的源代码zlib,如何将其集成到现有的Qt项目中,以便我可以从源代码编译库,并在我的项目中使用它?
是的,您需要为它创建一个项目文件.你可以在我用于几个项目的版本下面找到我的版本.
QT       -= core gui
TARGET = zlib
TEMPLATE = lib
# Use this for static zlib rather than the default dynamic
# CONFIG += staticlib
include(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.
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}
以下是将第 3 方存储库添加到 Qt 项目并从源代码构建它的说明。
有些人可以通过 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文件,仅表示“build zlibbefore myApp”。
# ~/myApp/myApp.pro
TEMPLATE = subdirs
CONFIG += ordered   # This tells Qt to compile the following SUBDIRS in order
SUBDIRS = zlib src
现在我们需要告诉 Qt 如何构建我们的第 3 方库。我们通过创建一个新.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您的应用程序文件以链接到第 3 方库。这有两个部分:
首先,我们将头文件添加到包含路径中。将此行添加到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. 但是从那里您应该能够通过转到您的基本目录并运行qmake和来构建包含第 3 方库的项目make。
cd ~/myApp
qmake -r
make
注意:非常感谢@LaszloPapp 启动此过程。这个答案的大部分来源材料都来自他的回答。
| 归档时间: | 
 | 
| 查看次数: | 5124 次 | 
| 最近记录: |