【问题标题】:Can I compile a Qt application while ignoring Qt's packaged libraries?我可以编译 Qt 应用程序而忽略 Qt 的打包库吗?
【发布时间】:2018-01-15 20:42:53
【问题描述】:

我正在尝试在 Antergos Arch Linux 中编译一个 Qt 应用程序,该应用程序使用了icu 相关的库。当我收到以下链接器错误时,我有点困惑:

/usr/bin/ld: warning: libicuuc.so.60, needed by /usr/lib/libxml2.so.2, may conflict with libicuuc.so.56
/usr/bin/ld: warning: libicudata.so.60, needed by /usr/lib/libicuuc.so.60, may conflict with libicudata.so.56

随后是对库中函数的几个未定义引用。我仔细检查了我系统上的所有libicu* 版本,只能找到版本60;直到我查看了我的 Qt 安装目录,在 Qt/5.10.0/gcc_64/lib 下,我才意识到 Qt 提供了版本 56 的库文件。

我对链接器相关的问题并不是很感兴趣。是否可以让编译器忽略 Qt 提供的库,而只链接我系统上已有的 60 版库?如果不是,我有哪些解决方法?

【问题讨论】:

    标签: c++ qt linker


    【解决方案1】:

    是和不是。

    理论上 Qt 可以简单地使用 v60 而不是 v56 icu 库,前提是这 2 个版本是二进制兼容的。

    但是,Qt 库特别需要 icu 库的 56 版本。此外,您正在尝试使用需要 icu 库版本 60 的 libxml。这意味着您同时需要版本 56 和 60,这是不可能的,因为您最终会得到相互冲突的符号。

    您问题的根源很可能是您使用了Qt公司提供的Qt包。此类软件包可与大多数 Linux 发行版一起使用,但它们不能 100% 兼容。

    解决方案是使用使用相同版本的 icu 库的 Qt 和 libxml 构建。 最简单的解决方案是使用 Linux 发行版提供的 Qt 库。另一种解决方案是从源代码构建 Qt。

    【讨论】:

    • 我认为对我来说最好的长期解决方案是从源代码构建 Qt,因为我将把它用于许多其他事情。感谢您的信息!
    【解决方案2】:

    PATH 变量中定义 v60 库 之前 Qt/(...)/lib; 的顺序。如果您使用的是bash shell,请在更改PATH 变量后通过运行hash 刷新它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多