使用 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 中使用qmake
比CMake
方便得多。虽然对于非 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:如何告诉 Qmake 在 Visual Studio 项目中包含 ws2_32