我可以在忽略Qt的打包库的同时编译Qt应用程序吗?

时间:2018-01-15 20:42:54

标签: c++ qt linker

我正在尝试在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/5.10.0/gcc_64/lib下的Qt安装目录,才意识到Qt正在提供版本56库文件。

我对链接器相关问题并不是那么热门。是否有可能让编译器忽略Qt提供的库,并且只链接我系统上已有的60版本库?如果没有,我有哪些解决方法?

2 个答案:

答案 0 :(得分:1)

是和否。

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

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

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

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

答案 1 :(得分:0)

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