我正在使用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
我的问题是:
看来我可以通过将主机上的arm编译版本中的相应库复制到目标来消除骨骼上的共享库错误。因此,目标需要所有库的副本,以便程序运行。由于这些是共享库并且它们未包含在最终可执行文件中,为什么我需要在主机上编译目标平台的源代码以使主机链接器满意?看起来共享库的arm编译版本从未在主机上使用过。我最初认为它是这样的,他们将与可执行文件打包,但这显然是不正确的。
如果我将所需的共享库从主机复制到目标上存储可执行文件的目录,程序仍然无法找到共享库。只有当我将所需的.so文件的副本放在目标上的/ usr / lib /文件夹中时,程序才会运行。运行可执行文件时搜索共享库的文件夹是什么?为什么不在自己的本地文件夹中找到共享库?
当我向项目中添加更多库时,管理它们的最佳方法是什么,并将它们放在目标上。我真的不想在我的主机上下载源代码,交叉编译arm,然后筛选生成的所有库,只传输我需要的骨骼上的.so文件。为目标提供可执行文件所需的库的正确方法是什么?是否有管理或使此过程自动化的工具/插件?
无论我添加到eclipse链接器的所有库,我如何确定所需的库是什么?
如果我想告诉eclipse不使用共享库,如何更改OpenCV,Curl和修改eclipse的编译脚本,以便使用静态库?
在进行嵌入式编程和交叉编译时,更常见的是使用共享库还是静态库?
感谢您的帮助。
答案 0 :(得分:1)
/ lib和/ usr / lib是查找共享库的常用位置。您可以通过定义LD_LIBRARY_PATH环境变量将目录添加到动态加载程序的搜索路径:
setenv LD_LIBRARY_PATH / home / me / lib:/ home / me / lib2