1.1.1 undefined reference to ** 问题
以 libSM 的报错为例:
1)首先得明确是什么库出了问题,需要先查找库
查询limSM库安装包名字 :apt-cache search libSM 第一行为 : libsm-dev
2)查看libSM.so安装位置
ldconfig -p|grep libSM
输出:
(base) jason:~$ ldconfig -p|grep libSM
libSM.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSM.so.6
libSM.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libSM.so
所以/usr/lib/x86_64-linux-gnu应该要放在LD_LIBRARY_PATH环境变量里面
gedit ~/.bashrc 添加 export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
记得 source
3)上面方法没有生效,我想是不是我的库链接有问题
ldd /usr/lib/x86_64-linux-gnu/libSM.so
输出:
(base) jason@jason:~$ ldd /usr/lib/x86_64-linux-gnu/libSM.so
linux-vdso.so.1 => (0x00007fffcf9cd000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f54c2c89000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f54c2a84000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f54c26ba000)
/lib64/ld-linux-x86-64.so.2 (0x00007f54c30ab000)
看来现在正常了,但问题并没有解决,还是报//usr/lib/x86_64-linux-gnu/libSM.so.6: undefined reference to `uuid_unparse_lower@UUID_1.0'
其中这句话感觉很重要,链接时顺序不对会报这个错,按道理caffe自己写的脚本编译顺序应该不会有问题,于是我想到是不是使用anaconda2环境时会先搜索anaconda2/lib里面的库文件导致的,当搜到了就不在使用刚才新装的uuid库文件了,去这个文件下面查看果真有这个libuuid
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找.
比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和libx.so,
这个时候会使用在./A的libx.a 而不会遵循动态库优先的原则,
因为./A是先找到的,并且没有同名动态库存在
4)终极大法出现:把anaconda2/lib下的libuuid库文件移走就好了,至此终于解决了这个问题
或者暂时 gedit ~/.bashrc 屏蔽 #export LD_LIBRARY_PATH=/home/lqql/anaconda3/lib/:$LD_LIBRARY_PATH
例如:libQt5Core.so.5: undefined reference to `u_errorName_58'
/usr/bin/ld: warning: libicui18n.so.58, needed by //home/lqql/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicuuc.so.58, needed by //home/lqql/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicudata.so.58, needed by //home/lqql/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
//home/lqql/anaconda3/lib/libQt5Core.so.5: undefined reference to `u_errorName_58'
//home/lqql/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_setMillis_58'
//home/lqql/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getAlias_58'
locate libicui18n 发现
/usr/lib/x86_64-linux-gnu/libicui18n.a
/usr/lib/x86_64-linux-gnu/libicui18n.so
/usr/lib/x86_64-linux-gnu/libicui18n.so.55
/usr/lib/x86_64-linux-gnu/libicui18n.so.55.1
/usr/local/cuda-10.1/nsight-compute-2019.4.0/host/linux-desktop-glibc_2_11_3-x64/libicui18n.so.56
/usr/local/cuda-10.1/nsight-systems-2019.3.7.5/Host-x86_64/libicui18n.so.56
而conda 中也有个 libicui18n.so 也就是说 链接时,链接到 /usr/lib/x86_64-linux-gnu/ 上了,我在上面添加了
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH ,呕心的问题也就是所conda经常会和本地的库冲突额
上面的操作后还是不行,尝试复制过去了
sudo cp /usr/lib/x86_64-linux-gnu/libQt5Core.so* /home/lqql/anaconda3/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libQt5Test.so /home/lqql/anaconda3/lib/
结果错的更多,只能把 libQt5Core.so 重新链接
lqql@lqql:~/anaconda3/lib$ sudo ln libQt5Core.so.5.9.7 libQt5Core.so
lqql@lqql:~/anaconda3/lib$ sudo ln libQt5Core.so.5.9.7 libQt5Core.so.5
lqql@lqql:~/anaconda3/lib$ sudo ln libQt5Core.so.5.9.7 libQt5Core.so.5.9
再次编译报错
//home/lqql/anaconda3/lib/libQt5Widgets.so.5: undefined reference to `QCoreApplication::setAttribute(Qt::ApplicationAttribute, bool)@Qt_5'
//home/lqql/anaconda3/lib/libQt5Widgets.so.5: undefined reference to `QDateTimeParser::skipToNextSection(int, QDateTime const&, QStringRef const&) const@Qt_5_PRIVATE_API'
ldd /home/lqql/anaconda3/lib/libQt5Widgets.so.5
/home/lqql/anaconda3/lib/libQt5Widgets.so.5: /home/lqql/anaconda3/lib/./libQt5Core.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/lqql/anaconda3/lib/libQt5Widgets.so.5)
/home/lqql/anaconda3/lib/libQt5Widgets.so.5: /home/lqql/anaconda3/lib/./libQt5Core.so.5: version `Qt_5.9' not found (required by /home/lqql/anaconda3/lib/libQt5Widgets.so.5)
/home/lqql/anaconda3/lib/libQt5Widgets.so.5: /home/lqql/anaconda3/lib/./libQt5Core.so.5: version `Qt_5' not found (required by /home/lqql/anaconda3/lib/libQt5Widgets.so.5)
libQt5Core.so.5: version `Qt_5_PRIVATE_API' not found ,看来问题还是出在 libQt5Core.so.5
最后还是重装一次anaconda。。。。,可以重装anaconda到另一个目录,然后把新库lib文件下所有的QT5开头的文件全部复制到老文件夹,这样可以不用重装python 库了。。。
现在的问题应该是需要安装 qt5.9了,主要anaconda安装的是5.9.7
于Qt官网:Index of /archive/qt
下载qt-opensource-linux-x64-5.9.7.run至Downloads目录
最后解决,因为编译时 最后链接 是先找的 /usr/lib/x86_64-linux-gnu/ 文件夹,而bin文件其实需要的是 /home/lqql/anaconda3/lib/
中的库,注意ln 链接时注意看先看看 文件夹中有没有同名的库,如果直接覆盖会非常的麻烦,甚至要重装系统
对于这种链接问题基本上就是链接文件夹或者链接顺序的问题!!!
sudo ln -s /home/lqql/anaconda3/lib/libicui18n.so.58 /usr/lib/x86_64-linux-gnu/libicui18n.so.58
sudo ln -s /home/lqql/anaconda3/lib/libicuuc.so.58 /usr/lib/x86_64-linux-gnu/libicuuc.so.58
sudo ln -s /home/lqql/anaconda3/lib/libicudata.so.58 /usr/lib/x86_64-linux-gnu/libicudata.so.58
例子2:/home/lqql/anaconda3/lib//libpng16.so.16: undefined reference to `inflateValidate@ZLIB_1.2.9'
cd /usr/lib/x86_64-linux-gnu
sudo ln -s /home/lqql/anaconda3/lib/libjpeg.so.9 /usr/lib/x86_64-linux-gnu/
sudo ln -s /home/lqql/anaconda3/lib/libpng16.so /usr/lib/x86_64-linux-gnu/
sudo ldconfig
makefile_config中,放开:USE_PKG_CONFIG := 1
ldd /home/lqql/anaconda3/lib/libpng16.so.16
linux-vdso.so.1 => (0x00007ffee53f5000)
libz.so.1 => /home/lqql/anaconda3/lib/./libz.so.1 (0x00007f6254d8c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f62548b8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f62544ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6254bc1000)
在anaconda文件中查询 版本为 : libz.so.1.2.11 ,也就是说报错需要的是1.2.9,而conda自带的为1.2.11
最后采用的方法还是将 conda中的 libpng全部备份,并且 sudo apt-get install libpng16-16
其实根本原因是 anaconda 和ros 包冲突,以后装机还是不用anaconda 了,太坑了,浪费两天时间
参考:
解决caffe编译时//usr/lib/x86_64-linux-gnu/libSM.so.6: undefined reference to `uuid_unparse_lower@UUID_1.0
6) libopencv_highgui.so.3.4.1: undefined reference to `QTest::keyToAscii(Qt::Key)@Qt_5'
cmakelist 中添加 link_directories
link_directories(输入你的MinGW中的lib文件夹的完整路径,不用引号)
sudo ln -s /home/lqql/anaconda3/lib/libQt5Test.so.5 /usr/local/lib/
7)
/usr/bin/ld: warning: libngraph.so, needed by /home/lqql/lib/openvino/install_dir/deployment_tools/inference_engine/lib/intel64/libinference_engine_legacy.so, not found (try using -rpath or -rpath-link)
/home/lqql/lib/openvino/install_dir/deployment_tools/inference_engine/lib/intel64/libinference_engine_transformations.so: undefined reference to `typeinfo for ngraph::op::v3::GRUCell'
因此输入
ldd /home/lqql/lib/openvino/install_dir/deployment_tools/inference_engine/lib/intel64/libinference_engine_legacy.so
得到
linux-vdso.so.1 => (0x00007fff90f9b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f01f85df000)
libinference_engine_transformations.so => not found
libngraph.so => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f01f825d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f01f7f54000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f01f7d3e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f01f7b21000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f01f7757000)
/lib64/ld-linux-x86-64.so.2 (0x00007f01f8bf2000)
说明libngraph.so 没有链接上,locate libngraph.so
得到
/home/lqql/lib/openvino/bin/intel64/Release/lib/libngraph.so
/home/lqql/lib/openvino/install_dir/lib/libngraph.so
因此在 /etc/ld.so.conf 文件中
/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,而通常通过源码包进行安装时,如果不
指定--prefix会将库安装在/usr/local目录下,而又没有在文件/etc/ld.so.conf中添加/usr/local/lib这个目录>。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错
添加内容后 sudo ldconfig
include /etc/ld.so.conf.d/*.conf
/usr/local/cuda-10.1/lib64
/home/lqql/lib/openvino/install_dir/lib/
/home/lqql/lib/openvino/install_dir/deployment_tools/inference_engine/lib/intel64/
1.1.2 "invalid use of incomplete type"
报错如下:error: expected type-specifier before ‘GlobalLocalizationEngineGicp’
头文件肯定包含进去了,但始终报错。后来发现是头文件中有个重复定义 #define,因为偷懒是直接从其他地方复制过来再修改的,结果忘了修改 。。。
#ifndef TST_HDL_GLOBAL_LOCALIZATION_FPFH_TEASER_HPP
#define TST_HDL_GLOBAL_LOCALIZATION_FPFH_TEASER_HPP
#endif
2.1.2 cuda版本
报错如下:
-- CUDA VERSION: 10.2
-- CUDA PATH: /usr/local/cuda-10.2
-- Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS CUDA_CUDART_LIBRARY) (found suitable exact version "10.2")
但其实我安装的cuda 是 10.1
可以尝试 cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.1/ ..
如果没用的话,代码中全局搜索 CUDA_VERSION ,我这里是在 getCuda.cmake 文件中 ,强行在 file(STRINGS "${CMAKE_SOURCE_DIR}/cuda.version" CUDA_VERSION) 后面添加 set(CUDA_VERSION "10.1")
3.1.3 cmakelist 使用总结
1)使用 CMAKE_INSTALL_PREFIX 来指定安装目录
方法1:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
方法二:
修改cmake文件,加入:
SET(CMAKE_INSTALL_PREFIX < install_path >)
2)FIND_LIBRARY 指定库的位置
set(VLPATH "/home/lqql/work_place/opencv/panorama_image/NISwGSP/UglyMan_NISwGSP_Stitching/vlfeat-0.9.20/bin/glnxa64" )
FIND_LIBRARY(VLFEAT_LIBRARY libvl.so ${VLPATH})
3)报错找不到头文件
先 locate 头文件名 ,寻找头文件是否存在,然后 cmake_list中 添加头文件目录INCLUDE_DIRECTORIES
include_directories(../../../thirdparty/comm/include)
4)报错找不到lib
添加需要链接的库文件目录LINK_DIRECTORIES
link_directories("/home/server/third/lib")
或者 添加需要链接的库文件路径LINK_LIBRARIES
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
5)查找库所在目录FIND_LIBRARY
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
如:FIND_LIBRARY(RUNTIME_LIB rt /usr/lib /usr/local/lib NO_DEFAULT_PATH) ,cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH
6)添加cpp
add_executable的时候要把所需要的cpp文件路径都要写进去,文件多的时候也是太麻烦,所以可以使用下面的指令把所有cpp文件合并到一个变量中
file(GLOB_RECURSE ALL_SRCS "*.cpp")
7)剔除某些cpp
当工程中有多个node文件的时候,就要把他们从这个变量中踢出去,因为多个node文件编到一个可执行文件中会出错。用下面的代码踢
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})