【发布时间】: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
我的问题是:
看来,通过将适当的库从主机上的 arm 编译版本复制到目标,我可以彻底摆脱共享库错误。因此,目标还需要所有库的副本才能运行程序。既然这些是共享库并且它们不包含在最终的可执行文件中,为什么我需要在主机上为目标平台编译源代码才能使主机链接器满意?似乎从未在主机上使用过 arm 编译版本的共享库。我最初以为是这样,它们会与可执行文件一起打包,但这显然是不正确的。
如果我将所需的共享库从主机复制到目标上存储可执行文件的目录,程序仍然无法找到共享库。仅当我将所需 .so 文件的副本放在目标上的 /usr/lib/ 文件夹中时,该程序才会运行。运行可执行文件时在哪些文件夹中搜索共享库?为什么它不会在自己的本地文件夹中找到共享库?
当我向我的项目中添加更多库时,管理它们并将它们放在目标上的最佳方法是什么。我真的不想在我的主机上下载源代码,交叉编译 arm,然后筛选所有生成的库,只传输我需要的 .so 文件。为目标仅提供可执行文件所需的库的正确方法是什么?是否有工具/插件可以管理或使此过程自动化?
无论我添加到 eclipse 链接器中的所有库如何,我如何才能确定所需的库?
如果我想告诉 eclipse 不使用共享库,如何更改 OpenCV、Curl 的编译脚本并修改 eclipse 以便使用静态库?
在进行嵌入式编程和交叉编译时,更典型的是使用共享库还是静态库?
感谢您的帮助。
【问题讨论】:
标签: c++ linux opencv ubuntu-12.04 cross-compiling