Linux学习笔记——如何在交叉编译时使用共享库

  test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=88e4142dceabd295369657b29757141f98a03753, not stripped

  从控制台的输出可以看出,该可执行文件运行平台为ARM,而不是AMD64。

  3.移动动态链接库

  【移动共享库至目标板/usr/lib目录中】

  通过FTP工具把共享库传输至树莓派中,然后通过cp指令复制到/usr/lib中

  sudo cp libtest.so /usr/lib

  linux系统中默认的搜多路径为/lib和/usr/lib,libtest.so可以复制到任何目录中。

  修改libtest.so的执行权限。

  sudo chmod 775 libtest.so

  4.执行

  【FTP上传】

  通过FTP工具把可执行文件test复制到树莓派中,然后通过ldd指令查看共享库链接状态。

  【检验】

  ldd test

  /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f7f000)

  libtest.so => /usr/lib/libtest.so (0xb6f6b000)

  libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e3b000)

  /lib/ld-linux-armhf.so.3 (0xb6f8d000)

  从控制台的输出可以看出,test成功链接了位于/usr/lib中的libtest.so

  【执行】

  ./test

  a=3

  b=2

  a+b=5

  a-b=1

  从执行结果看,前面所做的努力是正确的。

  5.总结

  回答在前言中的问题。

  【1】交叉编译时的共享库是否需要放置于目标板中,如果需要放置在哪个目录中。

  交叉编译之后的共享库需要复制到目标板中,最好放置于/usr/lib或/lib中,当然也有其他的方法,在这里不详细说明。

  【2】交叉编译时的共享库是否需要放置于宿主机中,如果需要放置于哪个目录中。

  交叉编译时确切的说链接过程中需要指定共享库的问题,通过-L指定目录,通过-l指定共享库名称。但是此时交叉编译的共享库最好不要放置于宿主机的/lib或/usr/lib中,以免产生混淆。

  综合【1】和【2】,libtest.so同时存在于目标板和宿主机中。

  【3】交叉编译时如何指定共享库

  通过-L指定目录,通过-l指定共享库名称

  【4】程序运行时如何查找共享库

  最直观的方法,复制到/usr/lib目录中,让linux系统自动查找。

  最后,发现博文写多了自己感觉好累啊,希望这些总结对大家有用。