QT5引用库出错即解决
先看错误:
/usr/bin/ld: warning: libicui18n.so.56, needed by //opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicuuc.so.56, needed by //opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicudata.so.56, needed by //opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘u_strToLower_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_getStandardName_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_getAlias_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘uenum_next_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘u_strToUpper_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_setSubstChars_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_getTimeZoneDisplayName_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_fromUnicode_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘u_errorName_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘uenum_close_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_getDSTSavings_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_openTimeZoneIDEnumeration_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_setMillis_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucol_close_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucol_getSortKey_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_get_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucol_open_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_compareNames_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_clone_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_open_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucol_setAttribute_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_openCountryTimeZones_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_open_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_openTimeZones_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_countAliases_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_inDaylightTime_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_close_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_getAvailableName_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_getDefaultName_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucal_getDefaultTimeZone_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_toUnicode_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucol_strcoll_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_close_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_getMaxCharSize_56’未定义的引用
//opt/Qt5.10.0/5.10.0/gcc_64/lib/libQt5Core.so.5:对‘ucnv_countAvailable_56’未定义的引用
发现
根据错误提示,libQt5Core.so.5找不到libicui18n.so.56等动态库。为什么会找不到呢?我用lld
命令看了libQt5Core.so.5:
jie@mao:/opt/Qt5.10.0/5.10.0/gcc_64/lib$ ldd libQt5Core.so.5
linux-vdso.so.1 => (0x00007ffc1efaa000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fab9827e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fab98064000)
libicui18n.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicui18n.so.56 (0x00007fab97bcb000)
libicuuc.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicuuc.so.56 (0x00007fab97813000)
libicudata.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicudata.so.56 (0x00007fab95e30000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fab95c2c000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007fab95a2a000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fab95719000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fab95397000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fab9508e000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fab94e78000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fab94aae000)
/lib64/ld-linux-x86-64.so.2 (0x00007fab98be9000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fab9483e000)
发现:
libicui18n.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicui18n.so.56 (0x00007fab97bcb000)
libicuuc.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicuuc.so.56 (0x00007fab97813000)
libicudata.so.56 => /opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicudata.so.56 (0x00007fab95e30000)
其中/opt/Qt5.10.0/5.10.0/gcc_64/lib/./libicui18n.so.56
多了个点。
分析
由于libicui18n.so.56
等动态库路径多了个点,导致libQt5Core.so.5找不到它们,所以导致了错误。由于Qt5我是正常安装的,动态库之间理应正确的连在一起,产生这个错误的原因,我猜是QT自己的问题。
解决
既然找不到libicui18n.so.56
等动态库,那我们可以显式的添加其库路径到编译器,如果是使用g++命令,直接把包含libicui18n.so.56
等动态库的路径添加到-l后,如果是使用CMake编译程序,可以在CMakeLists.txt中添加一句:
link_directories("/opt/Qt5.10.0/5.10.0/gcc_64/lib")