我正在尝试使用通过Conan/Artifactory安装的Qt 5.13.0来构建我们的应用程序。我们运行自己的Artifactory服务器,并且Qt版本在我们的CI解决方案中是自建的(并且是静态链接的)。我们使用Conan recipe for Qt written by the bincrafters,稍作修改,为已知的Qt bug应用了一些补丁,并设置了一些标志,以便在安卓和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++调用尝试在构建Qt Conan包的CI用户的主文件夹/home/dev/中查找依赖项。
只有Qt本身的依赖才有这个问题。可以在正确的位置找到应用程序的依赖项(也是通过Conan安装的)。
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包的过程中,我是否做错了什么,或者这是由不同的原因引起的吗?
发布于 2019-07-19 20:53:24
实际上,在构建qt时,依赖项的所有路径都硬编码在配置文件(mkspecs\modules\qt_lib_*.pri)中。我假设您正在使用qmake构建应用程序,因为您使用的是静态qt,而静态qt与cmake不兼容。您可以尝试将harfbuzz lib的完整路径传递给qmake,方法是在qmake调用中添加参数QMAKE_LIBS_HARFBUZZ=/home/kaupes/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a。
编辑:这似乎是qt >= 5.12.1:https://bugreports.qt.io/browse/QTBUG-72903的一种行为。此功能已通过https://github.com/qt/qtbase/commit/9864d2c6f3b628ca9f07a56b197e77bd43931cca在5.14.x和5.15.x中恢复
https://stackoverflow.com/questions/57095229
复制相似问题