在交叉编译后,无法在目标上找到共享库,Ubuntu到Beaglebone

时间:2013-12-12 06:37:29

标签: c++ linux opencv ubuntu-12.04 cross-compiling

我正在使用beaglebone white进行视觉项目。我正在使用运行Ubuntu 12.04 LTS的i686机器和带有CDT插件的eclipse IDE作为我的开发机器。我的beaglebone正在运行beaglebone.org提供的最新Angstrom发行版。我的问题与一般的交叉编译方法有关。

我的程序使用OpenCV和Curl c ++库。

到目前为止,在我的主机上,我已经下载了最新的OpenCV和Curl库,并为arm-linux架构编译了它们。

我的测试程序在我的开发电脑上编译没有错误并生成可执行文件。

我使用SCP通过以太网将可执行文件传输到beaglebone,当我运行程序时,我在beaglebone上收到以下错误:

“加载共享库时出错:libopencv_core.so.3.0:无法打开共享对象文件:没有这样的文件或目录”

在主机上,OpenCV和Curl源和库位于两个不同的位置。

对于我使用的OpenCV:

sudo cmake -DSOFTFP=ON -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../..
sudo make
sudo make install

在我的主机上的/ home / OpenCVArm / opencv / platforms / linux / build_hardfp / install /中创建了arm编译的OpenCV版本。

For Curl我用过:

sudo ./configure --host=arm-linux-gnueabi --build=i686-linux CFLAGS='-Os' --with-ssl=/usr/bin/openssl --enable-smtp
sudo make
sudo make install
创建Arm编译的curl库的

位于主机上的/ usr / local /中。

链接我程序中的所有库我在Eclipse中使用以下脚本:

arm-linux-gnueabi-g++ -L/usr/local/lib -L/home/OpenCVArm/opencv/platforms/linux/build_hardfp/install/lib -L/usr/arm-linux-gnueabi/lib -o "HelloWorlTest"  ./src/HelloWorlTest.o   -lopencv_highgui -lopencv_core -lopencv_imgproc -lcurl

我的问题是:

  1. 看来我可以通过将主机上的arm编译版本中的相应库复制到目标来消除骨骼上的共享库错误。因此,目标需要所有库的副本,以便程序运行。由于这些是共享库并且它们未包含在最终可执行文件中,为什么我需要在主机上编译目标平台的源代码以使主机链接器满意?看起来共享库的arm编译版本从未在主机上使用过。我最初认为它是这样的,他们将与可执行文件打包,但这显然是不正确的。

  2. 如果我将所需的共享库从主机复制到目标上存储可执行文件的目录,程序仍然无法找到共享库。只有当我将所需的.so文件的副本放在目标上的/ usr / lib /文件夹中时,程序才会运行。运行可执行文件时搜索共享库的文件夹是什么?为什么不在自己的本地文件夹中找到共享库?

  3. 当我向项目中添加更多库时,管理它们的最佳方法是什么,并将它们放在目标上。我真的不想在我的主机上下载源代码,交叉编译arm,然后筛选生成的所有库,只传输我需要的骨骼上的.so文件。为目标提供可执行文件所需的库的正确方法是什么?是否有管理或使此过程自动化的工具/插件?

  4. 无论我添加到eclipse链接器的所有库,我如何确定所需的库是什么?

  5. 如果我想告诉eclipse不使用共享库,如何更改OpenCV,Curl和修改eclipse的编译脚本,以便使用静态库?

  6. 在进行嵌入式编程和交叉编译时,更常见的是使用共享库还是静态库?

  7. 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 您只是让链接器在主机上拥有共享库。它查看共享库以确保解析程序使用的符号。它们没有链接或用于其他任何东西。
  2. / lib和/ usr / lib是查找共享库的常用位置。您可以通过定义LD_LIBRARY_PATH环境变量将目录添加到动态加载程序的搜索路径:

    setenv LD_LIBRARY_PATH / home / me / lib:/ home / me / lib2

  3. 我不知道是否有某种工具/插件。我用scp。 ; - )
  4. ldd命令将告诉您可执行文件使用的共享库。
  5. 好问题。我从来没有建造它们。通常,包将构建共享库和静态库。
  6. 我不知道是否更典型地使用共享库。我通常使用静态库。在我的ELLCC cross compiler project。 我用ELLCC来构建自己。生成的静态链接可执行文件实际上小于使用共享库的gcc编译可执行文件。当然,这是一套完全不同的C ++和C标准库。