gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:38 26 4
gpt4 key购买 nike

我正在使用 beaglebone white 进行视觉项目。我正在使用运行 Ubuntu 12.04 LTS 和带有 CDT 插件的 eclipse IDE 的 i686 机器作为我的开发机器。我的 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 编译版本。

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

感谢您的帮助。

最佳答案

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

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

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

关于c++ - 交叉编译后无法在目标上找到共享库,Ubuntu 到 Beaglebone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com