【问题标题】:Cannot find shared libraries on target after Cross-Compiling, Ubuntu to Beaglebone交叉编译后无法在目标上找到共享库,Ubuntu 到 Beaglebone
【发布时间】:2013-12-30 10:59:15
【问题描述】:

我正在使用 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/ 中创建 OpenCV 的 arm 编译版本。

对于我使用的卷曲:

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. 在进行嵌入式编程和交叉编译时,更典型的是使用共享库还是静态库?

感谢您的帮助。

【问题讨论】:

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


    【解决方案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 标准库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多