【问题标题】:Conan-based Qt installation uses wrong home dir for linking基于柯南的 Qt 安装使用错误的主目录进行链接
【发布时间】:2019-09-17 19:00:10
【问题描述】:

我正在尝试使用通过 Conan/Artifactory 安装的 Qt 5.13.0 构建我们的应用程序。我们运行我们自己的 Artifactory 服务器,并且 Qt 版本在我们的 CI 解决方案中有自构建(和静态链接)。我们使用Conan recipe for Qt written by the bincrafters,稍作修改以应用一些已知 Qt 错误的补丁,并设置一些标志以便在 Android 和 WebAssembly 上正确构建。

在尝试构建应用程序时,链接器无法为 Qt 本身找到必要的依赖项,因为它试图在构建 Qt 包的用户的主文件夹中查找它们,而不是在运行构建的用户的主文件夹中。

这是构建日志的摘录,显示了将所有先前编译的目标文件链接在一起的尝试:

       application folder-------v        subproject of the application----v-------v       dependency of the application, correct user home dir---------v                                             Qt library installed via Conan, correct user home dir-------v                                                            dependency of Qt, WRONG user home dir------------v
g++ -Wl,--gc-sections -o ../../fah [--> all the .o files <--] -L../lib -lmodel -lcore [--> more linked libraries and application parts <--] -L/home/kaupes/.conan/data/libsodium/1.0.18/bje/stable/package/d1efe3774eed76670888f919621e7c4e1b52efa9/lib  /home/kaupes/.conan/data/qt/5.13.0/bje/stable/package/d6b3f512e1a5607061462f94e3271dc8af3dd516/lib/libQt5Gui.a /home/dev/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a [--> many, many more libraries <--]
g++: error: /home/dev/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a: No such file or directory
many, many more errors...

如您所见,运行构建的用户是kaupes,但g++ 调用尝试在/home/dev/(构建Qt Conan 包的CI 用户的主文件夹)中查找依赖项。

只有 Qt 本身的依赖有问题。在正确的位置找到应用程序的依赖项(也通过柯南安装)。

Qt 包已使用以下 Conan 调用在 CI 中构建:

conan create --profile .conan/profiles/linux -s compiler=gcc -s compiler.version=9 . fah/stable

编译器和版本是明确设置的,因为我也是为另一个 GCC 版本构建的。 linux 配置文件也没有做任何有趣的事情(据我所知):

include(default)

[settings]
build_type=Release
compiler.libcxx=libstdc++11

[options]
OpenSSL:shared=False
OpenSSL:no_asm=True
OpenSSL:no_asm=True
OpenSSL:no_weak_ssl_ciphers=True
OpenSSL:no_ssl2=True
OpenSSL:no_ssl3=True
OpenSSL:no_engine=True
libcurl:shared=False
libxml2:shared=False
libxml2:fPIC=True
libsodium:shared=False

pcre2:shared=False
libpng:shared=False
freetype:shared=False
bzip2:shared=False
libjpeg:shared=False
harfbuzz:shared=False
xkbcommon:shared=False
qt:shared=False
qt:with_glib=False
qt:with_sqlite3=False
qt:with_mysql=False
qt:with_pq=False
qt:with_odbc=False
qt:with_sdl2=False
qt:with_openal=False
qt:with_libalsa=False
qt:openssl=True
qt:commercial=False
qt:qtsvg=True
qt:qtdeclarative=True
qt:qtactiveqt=False
qt:qtscript=False
qt:qtmultimedia=False
qt:qttools=True
qt:qtxmlpatterns=False
qt:qttranslations=True
qt:qtdoc=False
qt:qtrepotools=False
qt:qtqa=False
qt:qtlocation=True
qt:qtsensors=True
qt:qtwayland=True
qt:qt3d=False
qt:qtimageformats=False
qt:qtgraphicaleffects=True
qt:qtquickcontrols=True
qt:qtserialbus=False
qt:qtserialport=False
qt:qtx11extras=True
qt:qtmacextras=False
qt:qtwinextras=False
qt:qtandroidextras=False
qt:qtwebsockets=True
qt:qtwebchannel=False
qt:qtwebengine=False
qt:qtwebview=False
qt:qtquickcontrols2=True
qt:qtpurchasing=False
qt:qtcharts=True
qt:qtdatavis3d=False
qt:qtvirtualkeyboard=True
qt:qtgamepad=False
qt:qtscxml=False
qt:qtspeech=False
qt:qtnetworkauth=False
qt:qtremoteobjects=False
qt:qtwebglplugin=False
qt:qtlottie=False
qt:qtconnectivity=True

在创建或安装 Conan 包的过程中我做错了什么还是由其他原因引起的?

【问题讨论】:

  • 你从哪里下载了这个 Qt 包?您的描述中没有关于包裹的信息。请附上包装参考。
  • 在使用 bincrafters 的 Conan 配方在 CI 中构建 Qt 之后,我们从我们自己的 Artifactory 服务器下载此文件。我在开篇文章的第一段添加了一个链接。如果重要的话,构建环境是一个运行 Fedora 30 并安装了必要软件包的 Docker 容器。我们选择的选项需要的所有 Qt 依赖项也在 CI 中构建。

标签: qt conan


【解决方案1】:

确实,在构建 qt 时,所有依赖关系的路径都硬编码在配置文件 (mkspecs\modules\qt_lib_*.pri) 中。 我假设您正在使用 qmake 构建您的应用程序,因为您使用静态 qt,而静态 qt 与 cmake 不兼容。您可以尝试的一件事是通过在您的 qmake 调用中添加参数 QMAKE_LIBS_HARFBUZZ=/home/kaupes/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a 来将 harfbuzz lib 的完整路径传递给 qmake。

编辑:这似乎是 qt >= 5.12.1 的已知行为:https://bugreports.qt.io/browse/QTBUG-72903。此功能已在 5.14.x 和 5.15.x 中恢复为https://github.com/qt/qtbase/commit/9864d2c6f3b628ca9f07a56b197e77bd43931cca

【讨论】:

  • 谢谢,这为我提供了开始解决方案所需的信息。虽然使用环境变量设置库的路径不起作用,但我在我们的柯南配方中添加了一个deploy 方法,该方法将所有路径替换为通向构建用户主目录的路径。不完全优雅,但到目前为止它似乎工作正常。
  • 我的回答不够清楚。您不应该通过将QMAKE_LIBS_HARFBUZZ=.. 放在qmake ... 之前将环境变量添加到qmake 调用,而是应该通过调用qmake QMAKE_LIBS_HARFBUZZ=... 来使用命令行参数。 QMAKE_LIBS_HARFBUZZ 是 qmake 变量,不是环境变量
猜你喜欢
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多