【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序

2023-05-16

目录

找不到.so解决方法

方法一:添加环境变量

方法二:复制so文件到lib路径

方法三:(推荐)添加ldconfig寻找路径

方法四:在编译目标代码时指定该程序的动态库搜索路径

让程序在本目录找到库.so

其他命令

查看程序依赖的.so库

查看动态库连接过程

查看一个so链接库的版本

查看So 的版本、GCC版本、GLIB版本

nm 查看动态库和静态库中的符号

动态库查找顺序

动态库[链接时]路径和[运行时]路径

修改efl文件(程序、库文件)的库依赖路径

链接静态库/动态库

undefined symbol问题的查找、定位与解决方法

linux动态库工具ldconfig|更新.so链接


作者:bandaoyu,本文动态更新,源址:https://blog.csdn.net/bandaoyu/article/details/113181179

找不到.so解决方法

ldd   程序名   ,查看程序去哪里找库,找到没,如:ldd ceph-mon

原理:搜索.so的优先级顺序

  1. RPATH: 写在elf文件(即可执行文件)中,用readelf命令可查:readelf -d ceph-mon
  2. LD_LIBRARY_PATH: 环境变量
  3. RUNPATH:                 写在elf文件(即可执行文件)中
  4. ldconfig的缓存: 配置/etc/ld.conf*可改变
  5. 默认的/lib, /usr/lib

RPATH与RUNPATH中间隔着LD_LIBRARY_PATH。为了让用户可以通过修改D_LIBRARY_PATH来指定.so文件,大多数编译器都将输出的RPATH留空,并用RUNPATH代替RPATH。

原文:https://www.it610.com/article/1295147005911310336.htm

方法一:添加环境变量

(如果设置编译的时候指定了RPATH,这个设置可能就无效)

添加环境变量三种方式

1. 添加当前用户当前终端的环境变量(临时)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/...  #.so file path

2. 添加当前用户的环境变量

修改~/.bashrc文件,在其末尾,添加环境变量

vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/...  #.so file path

使其生效,

source ~/.bashrc

如不能生效,请重启

3. 添加所有用户的环境变量

修改profile文件,在其末尾添加环境变量

vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/...  #.so file path

使其生效

source /etc/profile

如不能生效,请重启

方法二:复制so文件到lib路径

linux系统的so库一般存储与“/usr/lib/”路径中,可将动态库复制到该路径中。

sudo cp liblibtest.so /usr/lib/

即时生效

方法三:(推荐)添加ldconfig寻找路径

程序加载动态库的时候实际是先加载ld.so,然后通过ld.so去加载其他库,所以配置ld.so.conf

但是加载顺序优优先级低于RPATH和LD_LIBRARY_PATH,所以前两者设置了,该配置可能无效

步骤1. 编辑链接配置文件

vim /etc/ld.so.conf,确认内容是否为如下,不是则修改为如下:

include /etc/ld.so.conf.d/*.conf

步骤2. 进入/etc/ld.so.conf.d目录内,创建*.conf文件,文件名随意,扩展名必须为.conf

cd /etc/ld.so.conf/
vim libmy.conf 

步骤4. 在文件内部,添加so的路径,保存并退出

/home/czd/eclipse-workspacee/calllib/Debug

步骤5. 执行命令时期生效

sudo ldconfig

程序在运行时寻找so库就会到添加的目录中寻找。

gcc 运行指定动态库的三种方法:https://blog.csdn.net/qq_38350702/article/details/106128030



方法四:在编译目标代码时指定该程序的动态库搜索路径

(优先级最高)

解决办法有两种,第一程序链接时指定链接库的位置,就是使用-wl,-rpath=<link_path>参数,<link_path>就是链接库的路径。如:

gcc -o foo foo.c -L. -lfoo -Wl,-rpath=/usr/mylib

上面就是指定了链接的位置在/usr/mylib,执行./foo时,foo会去/usr/mylib找libfoo.so库。

不过一般情况我们使用如下格式

gcc -o foo foo.c -L$(prefix)/lib -lfoo -Wl,-rpath=$(prefix)/lib

让程序在本目录找到库.so

1、为了让Linux能在本目录下找到so文件,需要修改.bash_profile。

2、在.bash_profile的最后位置添加代码(注意最后那个点“.”):

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

其他命令

查看程序依赖的.so库

查看可以执行程序需要哪些动态库,以及是否能找到

ldd  /usr/bin/mount

[root@rdma64 lcx]# ldd ./ceph_perf_msgr_server_normal
        linux-vdso.so.1 =>  (0x00007ffc24dec000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6f9a6ee000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f6f9a4ea000)
        libmymalloc.so => not found
        libjemalloc.so.1 => not found

        libsnappy.so.1 => /lib64/libsnappy.so.1 (0x00007f6f9a0e2000)
        libceph-common.so.0 => ./bak/libceph-common.so.0 (0x00007f6f912d5000)

查看可以执行程序需要哪些动态库,使用命令:
readelf   -d  [可执行程序]   

查看动态库连接过程

查keep

ldconfig -v | grep keep

ldconfig -p | grep keep

查看一个so链接库的版本

如果要准确的版本,看看这个库文件链接到那个具体文件:

/lib# file libhandle.so

libhandle.so: symbolic link to `libhandle.so.1'

lib# file libhandle.so.1

libhandle.so.1: symbolic link to `libhandle.so.1.0.3'

可以看到经过两次链接,最终文件名中1.0.3是版本号,其它方法只能得出主版本号

查看So 的版本、GCC版本、GLIB版本

strings libc.so | grep Version


1. 查看GLIB版本信息

strings xxx | grep GLIB

~$ strings libGL.so  | grep GLIB
GLIBC_2.2.5
GLIBC_2.3.2
GLIBC_2.3
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.14
GLIBC_2.17

2. 查看GCC版本信息

strings xxx | grep GCC

~$ strings libGL.so  | grep GCC
GCC_3.0
GCC: (Debian 6.4.0-22) 6.4.0 20180924

原文链接:https://blog.csdn.net/ternence_hsu/article/details/103045847

nm 查看动态库和静态库中的符号

nm [option(s)] [file(s)]

有用的options:

  • -A 在每个符号信息的前面打印所在对象文件名称;
  • -C 输出demangle过了的符号名称;
  • -D 打印动态符号;
  • -l 使用对象文件中的调试信息打印出所在源文件及行号;
  • -n 按照地址/符号值来排序;
  • -u 打印出那些未定义的符号;

常见的符号类型:

  • A 该符号的值在今后的链接中将不再改变;
  • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
  • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
  • T 该符号放在代码段中,通常是那些全局非静态函数;
  • U 该符号未定义过,需要自其他对象文件中链接进来;
  • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

注意几点:

  • -C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
  • 使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc。
  • 使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。

举例

更详细的内容见man page。这里举例说明:

nm -u hello.o

显示hello.o 中的未定义符号,需要和其他对象文件进行链接.

nm -A /usr/lib/* 2>/dev/null | grep "T memset"

在 /usr/lib/ 目录下找出哪个库文件定义了memset函数. 

动态库查找顺序

综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径; //-L、-rpath和-rpath-link

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

在上述1、2、3指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。

Linux动态库(.so)搜索路径:http://blog.csdn.net/21aspnet/article/details/6724457

动态库[链接时]路径和[运行时]路径

-L、-rpath和-rpath-link的区别;http://blog.csdn.net/q1302182594/article/details/42102961( -L、-rpath和-rpath-link的区别)

现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开。用户可以

  • 通过-L 指定编译连接时库的路径
  • 通过-R(或-rpath)指定程序运行时库的路径,

大大提高了库应用的灵活性。

比如我们在编译环境 gcc -o target -L /work/lib/zlib/  -llibz-1.2.3 (work/lib/zlib下是编译环境的动态库目录),将target编译好后我们只要把zlib下的库文件拷贝到运行环境的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

链接器ld的选项有 -L,-rpath 和 -rpath-link,大致是这个意思:

-L: “链接”的时候,去找的目录,也就是所有的 -lxxx 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径。

-rpath和-rpath-link都可以在链接时指定库的路径;但是运行可执行文件时,-rpath-link指定的路径就不再有效(链接器没有将库的路径包含进可执行文件中),

而-rpath指定的路径还有效(因为链接器已经将库的路径包含在可执行文件中了。)

修改efl文件(程序、库文件)的库依赖路径

工具:patchelf
(RHEL 已经自带了chrpath工具,直接使用即可. ( yum install chrpath)不过chrpath 有个缺陷,如果当前系统为x86_64,则修改i386 elf会报错,patchelf则无此问题!)

rpath全称是run-time search path。Linux下所有elf格式的文件都包含它,特别是可执行文件。它规定了可执行文件在寻找.so文件时的第一优先位置。用patchelf修改它的信息。rpath和patchelf:https://www.cnblogs.com/ar-cheng/p/13225342.html

查看demo依赖的库:

$ readelf -d demo
 

路径修改

更改程序或库运行时搜索依赖库的路径(多个路径用冒号隔开)

$ patchelf  --set-rpath   /opt/my-libs/lib:/other-libs   my-program

增加本目录路径是一个“.”而不是“./”

$patchelf  --set-rpath   /opt/my-libs/lib:/other-libs:.   my-program

去掉冗余的依赖库路径(Shrink the RPATH of executables and libraries:)

$ patchelf  --shrink-rpath  my-program

去掉冗余的依赖库路径,但保留/usr/lib:/foo/lib前缀的路径

$ patchelf  --shrink-rpath  --allowed-rpath-prefixes  /usr/lib:/foo/lib  my-program

依赖修改

删除依赖(删除my-program对libfoo.so.1的依赖

$ patchelf  --remove-needed  libfoo.so.1 my-program 

增加依赖(给my-program增加对libfoo.so.1的依赖
$ patchelf  --add-needed        libfoo.so.1 my-program  

更换依赖。原本是依赖 liboriginal.so.1,改为依赖 libreplacement.so.1

$ patchelf  --replace-needed  liboriginal.so.1  libreplacement.so.1  my-program 

更改动态库的短名(SONAME) :
$ patchelf  --set-soname  libnewname.so.3.4.5  path/to/libmylibrary.so.1.2.3 

关于SONAME,见:https://blog.csdn.net/bandaoyu/article/details/115307641

Change the dynamic loader ("ELF interpreter") of executables
$ patchelf  --set-interpreter /lib/my-ld-linux.so.2 my-program 

教程:patchelf工具:https://blog.csdn.net/juluwangriyue/article/details/108617283

官网使用说明:

README.md
PatchELF is a simple utility for modifying existing ELF executables and libraries. In particular, it can do the following:

Change the dynamic loader ("ELF interpreter") of executables:
$ patchelf --set-interpreter /lib/my-ld-linux.so.2 my-program

Change the RPATH of executables and libraries:
$ patchelf --set-rpath /opt/my-libs/lib:/other-libs my-program

Shrink the RPATH of executables and libraries:
$ patchelf --shrink-rpath my-program

This removes from the RPATH all directories that do not contain a library referenced by DT_NEEDED fields of the executable or library. For instance, if an executable references one library libfoo.so, has an RPATH /lib:/usr/lib:/foo/lib, and libfoo.so can only be found in /foo/lib, then the new RPATH will be /foo/lib.

In addition, the --allowed-rpath-prefixes option can be used for further rpath tuning. For instance, if an executable has an RPATH /tmp/build-foo/.libs:/foo/lib, it is probably desirable to keep the /foo/lib reference instead of the /tmp entry. To accomplish that, use:

$ patchelf --shrink-rpath --allowed-rpath-prefixes /usr/lib:/foo/lib my-program

Remove declared dependencies on dynamic libraries (DT_NEEDED entries):
$ patchelf --remove-needed libfoo.so.1 my-program

This option can be given multiple times.
Add a declared dependency on a dynamic library (DT_NEEDED):
$ patchelf --add-needed libfoo.so.1 my-program

This option can be give multiple times.
Replace a declared dependency on a dynamic library with another one (DT_NEEDED):

$ patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

This option can be give multiple times.

Change SONAME of a dynamic library:
$ patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3

链接静态库/动态库

链接静态库

链接静态库libadd_minus.a

方式一

gcc -o main2 main.o -L./ -ladd_minus

说明1:-L./表明库文件位置在当前文件夹

说明2: -ladd_minus 表示链接 libadd_minus.a 文件,使用“-l”参数时,前缀“lib”和后缀“.a”是需要省略的。

方式二、

-L/your/library/path  -l:libmylib.a

如果-l:filename格式指定一个文件名,连接程序直接去找这个文件名了,不会再像使用-lname时将name扩展成lib<name>.a格式的文件名.

当然如果库的位置不在gcc默认搜索路径中,要用-L参数另外指定搜索库的路径

在gcc编译链接时强制使用lib.a

当一个库文件既有.a又有.so时,如果这么写,gcc会优先链接.so文件:

gcc -L/path/to/library/ -ljemalloc -o run

有一种写法可以强制链接.a库文件:

gcc -L/path/to/library/ -l:libjemalloc.a -o run

这种写法也能解决当依赖库不是以libxxx.a或者libxxx.so规范命名时,可以通过指定库文件全名来解决。

链接动态库

gcc -o main4 main.o -L./ -ladd_minus -lmulti_div

说明1:-L./表明库文件位置在当前文件夹

说明2: -ladd_minus 表示链接 libadd_minus.so 文件,使用“-l”参数时,前缀“lib”和后缀“.so”是需要省略的。

  • 参考
    https://www.shiyanlou.com/courses/849/learning/

/lib64/libc.so.6: version `GLIBC_2.25' not found

glibc是什么

glibc是GNU发布的libc库,即c运行库



检查本机 glibc 版本

ldd --version

原因是:使用高级的命令安装了软件,但是本机还是使用的是低级的依赖库,因此会出现这种情况;使用 ldd --version 可以查看 glibc 的版本为 2.17 可知,确实还是老的依赖库。

解决:升级 centos6.8 升级 glibc 到 2.25 版本

下载 glibc-2.25.tar.gz  编译安装 https://mirrors.cloud.tencent.com/gnu/glibc/
链接:https://www.jianshu.com/p/5bb21028cde1

tar zxvf glibc-2.25.tar.gz
cd glibc-2.25
mkdir build
cd build
../configure --prefix=/opt/glibc-2.25
make -j4
sudo make install
export LD_LIBRARY_PATH=/opt/glibc-2.25/lib

原文链接:https://blog.csdn.net/weixin_44479465/article/details/112703715

undefined symbol问题的查找、定位与解决方法

(1)使用file 命令查看 so库的架构,看看是否与平台一致

可以看到,当前so库架构为x86-64,可以在GNU/Linux平台下使用。平台与架构一致

# lichunhong @ lichunhong-ThinkPad-T470p in ~/Documents/src/motion_planner/bin on git:dev x [18:47:54] 
$ file libpathplan.so 
libpathplan.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, 
BuildID[sha1]=32ae641e73c547376df20ca94746fbf5507de415, not stripped


接下来,需要定位一下 undefined symbol的具体信息

(2)通过 ldd -r xxx.so 命令查看so库链接状态和错误信息

ldd命令,可以查看对应的可执行文件或库文件依赖哪些库,但可执行文件或库文件要求与操作系统的编译器类型相同,即电脑是X86的GCC编译器,那么无法通过ldd命令查看ARM交叉编译器编译出来的可执行文件或库文件。

如果想在Ubuntu等Linux宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,可以通过以下命令:
readelf -d xxx.so | grep NEEDED
 

# lichunhong @ lichunhong-ThinkPad-T470p in ~/Documents/src/effective_robotics_programming_with_ros-master/catkin_ws/src/pathPlan/lib on git:lichunhong/dev x [18:57:19] 
$ ldd -r libpathplan.so
	linux-vdso.so.1 =>  (0x00007ffec1bd8000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f186cc0a000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f186c901000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f186c6eb000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f186c321000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f186d27a000)
undefined symbol: pthread_create	(./libpathplan.so)
undefined symbol: _ZN12ninebot_algo10AprAlgoLog9instance_E	(./libpathplan.so)
undefined symbol: _ZN2cv3maxERKNS_3MatES2_	(./libpathplan.so)
undefined symbol: _ZN12ninebot_algo10AprAlgoLog8WriteLogE10LEVEL_TYPEPKcS3_z	(./libpathplan.so)
undefined symbol: _ZN2cv6dilateERKNS_11_InputArrayERKNS_12_OutputArrayES2_NS_6Point_IiEEiiRKNS_7Scalar_IdEE	(./libpathplan.so)
undefined symbol: _ZN2cvgtERKNS_3MatEd	(./libpathplan.so)
undefined symbol: _ZN2cv8fastFreeEPv	(./libpathplan.so)
undefined symbol: _ZN2cv3Mat5setToERKNS_11_InputArrayES3_	(./libpathplan.so)
undefined symbol: _ZN12ninebot_algo10AprAlgoLog9instance_E	(./libpathplan.so)


可以看到有好多 undefined symbol ,其中就有提到的 _ZN12ninebot_algo10AprAlgoLog9instance_E 错误

(3) 使用 c++filt symbol 定位错误在那个C++文件中

从上面的undefined symbol中,通过c++filt <symbol>,可以定位到大多是opencv的问题

# lichunhong @ lichunhong-ThinkPad-T470p in ~/Documents/src/effective_robotics_programming_with_ros-master/catkin_ws/src/pathPlan/lib on git:lichunhong/dev x [19:04:26] C:1
$ c++filt _ZN2cv7waitKeyEi
cv::waitKey(int)
 
# lichunhong @ lichunhong-ThinkPad-T470p in ~/Documents/src/effective_robotics_programming_with_ros-master/catkin_ws/src/pathPlan/lib on git:lichunhong/dev x [19:04:31] 
$ c++filt _ZN2cv3maxERKNS_3MatES2_
cv::max(cv::Mat const&, cv::Mat const&)



原文链接:https://blog.csdn.net/buknow/article/details/96130049

ldd 生成详细信息,包括符号版本控制数据 -v:ldd -v test

 ldd 产生未使用的直接依赖关系 -u:ldd -u test

 ldd 查看是否缺少依赖库 -d:ldd -d test

 ldd 查看是否缺少符号和对象 -r:ldd -r test

linux动态库工具ldconfig|更新.so链接

(摘自:ldconfig https://www.liangzl.com/get-article-detail-20433.html)

Linux的动态库默认是配置在 /etc/ld.so.conf 文件中(当然,可以通过 include 命令加载额外的配置文件),ldconfig读取所有配置路径,加载这些路径下的所有动态库,并保存到 /etc/ld.so.cache缓存文件中。

示例:

有三个动态库文件 libtest.1.so,libtest.2.so,libtest.3.so,并且这三个动态库的SONAME都是 libtest.so。

    (1)默认情况下,执行 $ ldconfig,会搜索 /etc/ld.so.conf 文件下配置的所有路径,更新软链,并更新 /etc/ld.so.cache 文件。

    (2)-n dir选项:扫描指定目录dir下的所有so,根据文件名中的最新版本号,更新软链,并更新 /etc/ld.so.cache文件。如,

            $ ldconfig -n ./    # 生成 libtest.so,libtest.so是一个软链接,指向版本号最大的动态库 libtest.3.so

            $ ls -al
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.1.so
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.2.so
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.3.so
                lrwxrwxrwx 1 yepanl yepanl 12 Oct  9 16:56 libtest.so -> libtest.3.so

    (3)-l src dest选项:重新指定软链的连接目标。如,

            $ ldconfig -l libtest.so libtest.2.so    # 指定 libtest.so 链接到 libtest.2.so

            $ ls -al
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.1.so
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.2.so
                -rwxrwxr-x 1 yepanl yepanl 8612 Oct  8 11:38 libtest.3.so
                lrwxrwxrwx 1 yepanl yepanl 12 Oct  9 16:59 libtest.so -> libtest.2.so

    (4)-N选项:只更新软链接,不更新 /etc/ld.so.cache 缓存。如,在 /etc/lib.so.conf.d/ 目录下配置了 test.conf 文件,文件中配置了当前动态库的的路径。

            $ sudo ldconfig -N    # 生成 libtest.so,不更新 /etc/ld.so.cache 文件。

    (5)-X选项:只更新 /etc/ld.so.cache 缓存,不更新软链接。如,在 /etc/lib.so.conf.d/ 目录下配置了 test.conf 文件,文件中配置了当前动态库的路径。

            $ sudo ldconfig -X    # 不生成 libtest.so,只更新 /etc/ld.so.cache 文件。

    (6)-f config选项:搜索指定的 config 文件,而非 /etc/ld.so.conf 文件。如,当前目录下配置了 test.conf 文件,文件中配置了当前动态库的路径。

            $ sudo ldconfig -f test.conf    # 生成 libtest.so,更新 /etc/ld.so.cache 文件,只搜索 test.conf,不搜索 /etc/lib.so.conf

    (7)-C cache选项:更新指定的 cache 文件,而非 /etc/ld.so.cache 文件。

            关于这个选项,测试发现没有生成指定的 cache 文件,有待进一步验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序 的相关文章

  • 三维空间中,向量在另外一个向量或者面上的投影

    1 向量在另外一个向量上的投影 求向量u在向量v上的投影 定义为u xff0c 为两向量的夹角 一个向量有两个属性 xff0c 大小和方向首先明确向量点乘的含义 u v
  • C++编程02(引用、参数传递、内联函数)

    C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 引用 文章目录 C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 一 引用1 引用的实质2 引用必须初始化3 对数组建立引用 二
  • 使用Git bash查看之前版本和恢复最新版本的方法

    项目场景 xff1a 作为实习生 xff0c 一直在帮公司搞C 43 43 的图像识别项目 xff0c 因为总是改需求 xff0c 所以我的代码注释的一大片 xff0c 不便于整理 xff0c 有时候改的改的 xff0c 就找不到之前的版本
  • Windows平台下CMake使用报错No CMAKE_CXX_COMPILER could be found

    今天在笔记本建立了一个Cmakelists xff0c 使用cmake编译的时候 xff0c 报错 No CMAKE CXX COMPILER could be found No CMAKE C COMPILER could be foun
  • Cartographer编译方法及编译出错(glog库链接错误)解决方法

    最近在重新调试Carto代码 xff0c 想把自己的代码加入到Carto中 xff0c 原本想在IDE中调试 xff0c 然而Carto编译方式比较奇葩 xff08 catkin make isolated install use ninj
  • 什么是RTOS?RTOS与普通操作系统的区别

    一 xff1a 什么是RTOS RTOS Real Time Operating System xff0c 实时操作系统 实时性是其最大特征 xff0c 实时操作系统中都要包含一个实时任务调度器 xff0c 这个任务调度器与其它操作系统的最
  • 进度条(CSS)

    效果 xff08 实际有动态效果 xff09 html span class token tag span class token tag span class token punctuation lt span div span span
  • 终端命令行打开vscode

    在指定文件夹内 xff0c 使用终端命令行打开vscode 在当前目录打开vscode code 如果code命令无法使用 xff0c 需要配路径 xff0c 如下 xff1a 打开bash或者zsh配置文件 bash 用户请使用 vi b
  • 串口缓冲区管理分析

    一 概述 xff1a 串口使用时一般包含两个缓冲区 xff0c 即发送缓冲区和接收缓冲区 发送数据时 xff0c 先将数据存在发送缓冲区 xff0c 然后通过串口发送 xff1b 接收数据时 xff0c 先将接收的数据存在接收缓冲区 xff
  • array element has incomplete type

    http stackoverflow com search q 61 luaL reg 43 incomplete 43 type libs edje lua2 o edje lua2 c 183 error array type has
  • rt-thread学习记录(一)--内核的移植

    rt thread学习记录 xff08 一 xff09 内核的移植 1 基本选择 在rt thread官网上 xff0c 看到其对stm32芯片的支持 xff0c 因此选择stm32c8t6最小系统来进行移植内核 xff0c rt thre
  • rt-thread内核启动分析

    1 项目准备 上一节的基本环境 如rh thread 基本环境的搭建 硬件材料stm32f103C8T6 以及st link rt thread 内核启动官网分析 在分析rt thread代码的时候 由于rt thread的代码是十分优秀的
  • 达梦数据库sql语句记录

    登入 在ubuntu上安装好达梦数据 xff0c 并且生成实例 xff0c 在ubuntu上进行安装目录 xff0c 采用在tools目录下 xff0c 使用 disql进行命令行模式 xff0c 连接服务器 xff1a Conn sysd
  • vertx web开发(一)

    vertx web开发 最近在开发中 xff0c 由于spring 的大而全 xff0c 反而不实用于一下小项目 xff0c 因为spring boot在空载的情况 xff0c 至少其内存占用超过150M 而对于一些简单的项目反到不适用 而
  • kotlin协程实现原理

    传统runnable接口实现 在java中 xff0c 很多耗时的行为通过实现runnable接口 xff0c 并且通过线程运行下这些耗时的任务 xff0c 例如 xff1a span class token keyword public
  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法
  • PCL-使用potree可视化

    前言 在几篇文章中 xff0c 基本实现了对PCL相关操作 xff0c 最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化 1 Potree 官方运行 P
  • PCL- Las文件处理

    前言 在对点云数据处理的时候 xff0c 很多时候激光雷达扫描的文件不一定是 pcd文件 xff0c 这个时候需要进行相关文件处理 xff0c 如Las xff0c laz e57等文件格式 xff0c 本文将介绍las文件的读写 1 引入
  • PCL-Window下安装

    1 安装编译工具链MSVC MSVC工具链是visual studio 自带的工具链 xff0c 因此安装visual studio社区版即安装完成相应的MSVC工具链 2 安装Clion 相比与Visual studio的界面来说 xff
  • STM32 串口详细讲解

    什么是串口 UART Universal Asynchronous Receiver Transmitter 通用异步收发器 USART Universal Synchronous Asynchronous Receiver Transmi

随机推荐

  • ubuntu 修改pip指定路径

    参考这篇文章 还有 这篇文章 第二篇更好一点 xff0c 亲测成功
  • CrowdHuman数据集介绍

    CrowdHuman数据集是旷世发布的用于行人检测的数据集 xff0c 图片数据大多来自于google搜索 CrowdHuman 数据集数据量比较大 xff0c 训练集15000张 xff0c 测试集5000张 xff0c 验证集4370张
  • CityPersons数据集介绍

    CityPersons数据集是cityscape的一个子集 xff0c 它只包含个人注释 有2975张图片用于培训 xff0c 500张和1575张图片用于验证和测试 一幅图像中行人的平均数量为7人 xff0c 提供了可视区域和全身标注 C
  • CUHK-SYSU数据集介绍

    该数据集是一个大规模的人员搜索基准 xff0c 包含18184张图像和8432个身份 根据图像来源 xff0c 数据集可以分为两部分 xff1a 街道捕捉和电影 xff1a 在街拍中 xff0c 图像通过手持摄像机收集 xff0c 跨越数百
  • ETHZ数据集介绍

    Ess等构建了基于双目视觉的行人数据库用于多人的行人检测与跟踪研究 该数据库采用一对车载的AVT Marlins F033C摄像头进行拍摄 xff0c 分辨率为640 480 xff0c 帧率13 14fps xff0c 给出标定信息和行人
  • Swin Transformer V2

    Swin Transformer V2 论文链接 xff1a https arxiv org pdf 2111 09833 pdf 代码链接 xff1a https github com microsoft Swin Transformer
  • Jetson_Xavier_NX使用教程1(刷机)

    刷机教程 一 xff1a 准备 1 xff1a 准备需要一个tf卡 xff0c 容量最好大点 xff0c 我买的128G的 2 xff1a 还有两个软件一个是格式化卡的软件 xff0c 一个是将镜像文件写入的卡的软件 格式化卡的软件 写入镜
  • Jetson_Xavier_NX使用教程2(简单实用)

    本文会介绍一些刷机后的基本操作 1 风扇控制 刚开始插入电源风扇不转我以外坏了 xff0c 后来才发现并没有 Xavier NX的风扇在系统内核中有一套自动控制温度和转速的算法 xff0c 经过我观察大约在40度左右的时候会自动开启风扇进行
  • NVIDIA Jetson NX使用教程3配置pytorch环境

    本节主要记录 xff0c 安装pytorch及torch vision 1 下载Pytorch 因为jetson属于arm架构的机器 xff0c 所以需要去nvidia的官网下载对应的安装包而不是pytroch的官网 官网链接 xff0c
  • Java 基于 IETF RFC 2617 身份认证

    IETF RFC 2617 身份认证 是基于 HTTP 协议进行验证的 xff0c 认证过程中需要发送两次 HTTP 请求 xff0c 第一次请求服务器返回 401 和 认证标识 xff08 nonce xff09 xff0c 第二次访问H
  • 判断一台机器是大端序还是小端序

    在几乎所有的机器上 xff0c 多字节对象都被存储为连续的字节序列 例如在C语言中 xff0c 一个类型为int的变量x地址为0x100 xff0c 那么其对应地址表达式 amp x的值为0x100 且x的四个字节将被存储在存储器的0x10
  • STL容器保存智能指针并将this指针通过emplace传入STL容器所造成的致命问题(【double free or corruption (out)】和【bad_weak_ptr】)

    我用std queue保存了一个Message类型的智能指针 queue lt shared ptr lt MessageA gt xff0c 然后在Message类型中来将this指针插入队列 xff0c 使用std queue push
  • 实时动态定位(RTK)

    内容来着网络 实时动态定位 xff1a Real Time Kinematic RTK技术的关键在于使用了GPS的载波相位观测量 xff0c 并利用了参考站和移动站之间观测误差的空间相关性 xff0c 通过差分的方式除去移动站观测数据中的大
  • 几个实用的 Bat 脚本命令

    文章目录 1 截图2 息屏后锁屏3 查看当前的路径4 倒计时5 密码输入6 比较两个文本的差异 1 截图 start snippingtool 2 息屏后锁屏 powershell Add Type 39 DllImport 34 user
  • 学习cmake的使用和CMakeLists.txt

    1 学习cmake的使用和CMakeLists txt 文章目录 1 学习cmake的使用和CMakeLists txt1 1 cmake外部构建基础1 2 让每个源文件目录都包含一个CMakeLists txt1 3 安装 1 4 构建静
  • ROS系统基础知识梳理(四) 串口通信

    ROS系统基础知识梳理 四 串口通信 学习ROS系统 xff0c 初步接触到ROS系统外接传感器 xff0c 传感器通过Uart通信向台式机发送数据 xff0c 内容涉及到ROS调用串口数据 串口数据校验 以及欧拉角转换四元数 任务系统 x
  • Keil5中添加新的.c和.h文件

    目录 在Project的文件夹中添加添加路径使用include 在Project的文件夹中添加 如图1所示 xff0c 在User的文件夹上右键 xff0c 添加已有文件 图1 添加路径 然后需要在options for Target xf
  • 学习c语言的总结

    学习时间 xff1a 早上9点 晚上9点 学习内容 xff1a 利用c语言对 的代码学习 xff0c 并根据自己的理解编写代码 xff0c 最后整合学习的代码和自己理解的代码 xff0c 编写出更优的代码 学习体会 xff1a 对一个问题举
  • C/C++程序编译成可执行程序步骤图文源码详解

    一个C 43 43 程序被编译为目标程序的过程中经历了四个部分 xff0c 分别是预处理 编译 汇编 链接 下面将通过一个简单的C 43 43 代码分别执行预处理 编译 汇编 链接四个步骤后的结果和基本原理讲解 注意 xff1a 博主是在u
  • 【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序

    目录 找不到 so解决方法 方法一 xff1a 添加环境变量 方法二 xff1a 复制so文件到lib路径 方法三 xff1a xff08 推荐 xff09 添加ldconfig寻找路径 方法四 xff1a 在编译目标代码时指定该程序的动态