使用 qmake 下载和构建第三方库

Posted

技术标签:

【中文标题】使用 qmake 下载和构建第三方库【英文标题】:Download and build third-party libraries with qmake 【发布时间】:2017-07-01 16:06:43 【问题描述】:

CMake 项目中,我使用了ExternalProject_Add 函数来增加可移植性并减少在我自己的 Git 存储库中存储不必要的文件。此功能可以下载、配置、构建和安装(到特定位置)外部库。我正在 qmake 中寻找相同的功能,或者比我的以下试验更“hacky”的东西。

假设我想在我的 Qt 项目中使用Google Test(尽管 Qt 有自己的),如下所示:

#include <QtDebug>
#include <gtest/gtest.h>

TEST(Foo, FooTest) 
    qDebug() << "FooTest called...";
    ASSERT_TRUE(true);


int main(int argc, char *argv[]) 
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();

在项目文件中,我不想处理如何获得 Google 测试库,而是指望它:

TEMPLATE = app
QT += core
QT -= gui

CONFIG += c++14 console
CONFIG -= app_bundle

EP_BASE = $$OUT_PWD/3rdParty
include($$PWD/GTest.pri)

TARGET = FreeTesting
SOURCES += main.cpp
DEPENDPATH += $$EP_BASE/Install/gtest/include
INCLUDEPATH += $$EP_BASE/Install/gtest/include
LIBS += -L$$EP_BASE/Install/gtest/lib/ -lgtest -lgmock

现在这是我的“hacky”GTest.pri 文件,用于下载、构建和安装库:

GTEST_V180 = "https://github.com/google/googletest/archive/release-1.8.0.tar.gz"

GTEST_DOWNLOAD_STEP = mkdir -p $$EP_BASE/Source/gtest; cd $$EP_BASE/Source/gtest; \
    curl -L $$GTEST_V180 | tar xzv --strip 1
GTEST_BUILD_STEP = mkdir -p $$EP_BASE/Build/gtest; cd $$EP_BASE/Build/gtest; \
    cmake $$EP_BASE/Source/gtest/ -DCMAKE_INSTALL_PREFIX=$$EP_BASE/Install/gtest; \
    make
GTEST_INSTALL_STEP = mkdir -p $$EP_BASE/Install/gtest; cd $$EP_BASE/Build/gtest; \
    make install

gtest.target = googletest
gtest.commands = if [ ! -d $$EP_BASE/Install/gtest/lib ]; then
gtest.commands += $$GTEST_DOWNLOAD_STEP; $$GTEST_BUILD_STEP; $$GTEST_INSTALL_STEP;
gtest.commands += fi

QMAKE_EXTRA_TARGETS += gtest
PRE_TARGETDEPS += googletest

我不想在这个方向上更进一步的原因是,如果有针对同一问题的内置(或者只是更好、更方便)的解决方案,我不想依赖特定于平台的命令。

【问题讨论】:

为什么不直接使用 CMake? @Velkan,我认为在 Qt Creator 中使用qmakeCMake 方便得多。虽然对于非 Qt 项目我使用CMake. @Velkan,或者您提到使用CMake 仅用于下载和构建外部库? Qt Creator 可以正常打开 CMake 文件。 Qmake 不是一个会收到许多未来发展的东西。所以我什么都用 CMake。 在 2019 年对此表示支持,因为它是该方向的第一个谷歌搜索结果,这里没有明确的答案 【参考方案1】:

我尝试了很多选项,最终选择了这个 sn-p。最有意思的是,这个方案将qmake lame Makefile替换为实际库的Makefile,自然的融入到项目中。

include(../common.pri)

TEMPLATE = aux
LIBPCAP_URL = "http://www.tcpdump.org/release/libpcap-1.9.1.tar.gz"

tcpdump_libpcap.target = $$LIBPCAP
tcpdump_libpcap.depends = FORCE
tcpdump_libpcap.commands = \
    (wget -qO - $$LIBPCAP_URL | tar --strip-components=1 -zxf -) && \
    (CC=\"$$QMAKE_CC\" CFLAGS=\"$$QMAKE_CFLAGS_RELEASE\" ./configure \
    --host=$$NDK_TOOLCHAIN_PREFIX --disable-bluetooth --disable-dbus --disable-shared --disable-usb) && \
    make $$tcpdump_libpcap.target

QMAKE_EXTRA_TARGETS += tcpdump_libpcap
PRE_TARGETDEPS += $$tcpdump_libpcap.target

DISTFILES += CMakeLists.txt

【讨论】:

以上是关于使用 qmake 下载和构建第三方库的主要内容,如果未能解决你的问题,请参考以下文章

qt 怎么使用第三方库

Qt:如何告诉 Qmake 在 Visual Studio 项目中包含 ws2_32

第三方库如何在 Objective-C 和 Xcode 中工作?

Python标准库和第三方库有啥区别

TViOS 第三方库 marmelroy/Zip

python标准库和第三方库的区别