本文主要对 C++ 中的链接问题展开深入分析。阐述了链接在 C++ 程序构建过程中的重要地位,包括其如何将各个编译单元整合起来。详细讨论了常见的链接错误类型,如符号未定义、符号多重定义等问题产生的原因。同时,会介绍分析链接问题所需要的工具和方法,以及针对不同链接问题的有效解决策略,帮助 C++ 开发者更好地理解和处理程序开发过程中遇到的链接相关难题。

1. 动态库调试

1.1. 查看动态库里面的函数

查看生成的.so里面是否有函数fhapp_hwm_get_laser_almpm_ooph

nm -D libbrd_comn_690e_4tn4.so | grep fhapp_hwm_get_laser_almpm_ooph

输出为:fhapp_hwm_get_laser_almpm_ooph,即表示.so里面有fhapp函数。

1.2. 使用ldd查看.so里面有那些链接库

1.3. 使用md5sum命令生成和校验文件的md5值(用于确认传送的文件是否传送正确和完整)

2. 链接库列表

C++在链接时会生成一个文件link.txt,记录目标文件(生成库或者可执行文件)的链接库列表

/usr/bin/c++ -static -static-libstdc++ -static-libgcc CMakeFiles/ABOCRServer.dir/main.cpp.o CMakeFiles/ABOCRServer.dir/RobustMatcher.cpp.o CMakeFiles/ABOCRServer.dir/Tools.cpp.o  -o ABOCRServer /usr/local/lib/libopencv_calib3d.a /usr/local/lib/libopencv_core.a /usr/local/lib/libopencv_dnn.a /usr/local/lib/libopencv_features2d.a /usr/local/lib/libopencv_flann.a /usr/local/lib/libopencv_highgui.a /usr/local/lib/libopencv_imgcodecs.a /usr/local/lib/libopencv_imgproc.a /usr/local/lib/libopencv_ml.a /usr/local/lib/libopencv_objdetect.a /usr/local/lib/libopencv_photo.a /usr/local/lib/libopencv_shape.a /usr/local/lib/libopencv_stitching.a /usr/local/lib/libopencv_superres.a /usr/local/lib/libopencv_video.a /usr/local/lib/libopencv_videoio.a /usr/local/lib/libopencv_videostab.a /usr/local/share/OpenCV/3rdparty/lib/liblibprotobuf.a /usr/local/lib/libopencv_calib3d.a /usr/local/lib/libopencv_features2d.a /usr/local/lib/libopencv_flann.a /usr/local/lib/libopencv_highgui.a -lgtk-x11-2.0 -lgdk-x11-2.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lgthread-2.0 /usr/local/lib/libopencv_photo.a /usr/local/lib/libopencv_video.a /usr/local/lib/libopencv_videoio.a /usr/local/lib/libopencv_imgcodecs.a /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/local/share/OpenCV/3rdparty/lib/liblibwebp.a /usr/lib/x86_64-linux-gnu/libpng.a /usr/local/share/OpenCV/3rdparty/lib/liblibtiff.a /usr/local/share/OpenCV/3rdparty/lib/liblibjasper.a /usr/local/share/OpenCV/3rdparty/lib/libIlmImf.a /usr/local/lib/libopencv_imgproc.a /usr/local/lib/libopencv_core.a /usr/lib/x86_64-linux-gnu/libz.a /root/ocr/opencv/ABOCRServer/license.a -lavcodec -lavformat -lavutil -lswscale -ldl -lm -lpthread -lrt -lc

3. 环境变量的查看与设置

一般是指操作系统中指定操作系统运行环境的一些参数。它相当于一个指针,想要查看变量的值,需要加上“$”。

3.1. 显示环境变量

export 命令显示当前系统定义的所有环境变量
echo $PATH 命令输出当前的 PATH 环境变量的值

3.2. 配置环境变量

export 命令直接修改 PATH 的值,配置 MySQL 进入环境变量的方法:
export PATH=/home/uusama/mysql/bin:$PATH

参考文献

Linux 动态库.so 调试(nm,ldd和md5sum)_陌上花开缓缓归以的博客-CSDN博客

C++编译连接问题总结(cmake库连接设置、环境变量设置与查看、C++静态库与动态库、软连接与硬链接)_make环境变量设置-CSDN博客

更多推荐