cmake 编译及Debug

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.runDownloads目录

最后解决,因为编译时 最后链接 是先找的 /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})

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值