基于柯南的 Qt 安装使用错误的主目录进行链接

Conan-based Qt installation uses wrong home dir for linking

我正在尝试使用通过 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/ 中查找依赖项CI 构建 Qt Conan 包的用户的文件夹。

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

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

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 时,所有依赖项的路径都硬编码在配置文件 (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. This feature has been reverted in 5.14.x and 5.15.x with https://github.com/qt/qtbase/commit/9864d2c6f3b628ca9f07a56b197e77bd43931cca