我正在使用beaglebone白色的視覺項目。我正在使用運行Ubuntu 12.04 LTS的i686機器和使用CDT插件的eclipse IDE作爲我的開發機器。我的beaglebone正在運行由beaglebone.org提供的最新的Angstrom發行版。我的問題與一般的交叉編譯方法有關。交叉編譯後,在目標上找不到共享庫,Ubuntu Beaglebone
我的程序使用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的/平臺/我的主機在Linux/build_hardfp /安裝/ OpenCV的手臂編譯版本。
對於捲曲我用:
sudo ./configure --host=arm-linux-gnueabi --build=i686-linux CFLAGS='-Os' --with-ssl=/usr/bin/openssl --enable-smtp
sudo make
sudo make install
它創建編譯curl庫手臂是在/ usr /本地/主機上。
所有庫鏈接在我的節目,我使用的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編譯版本。我最初認爲這是因爲它們會與可執行文件打包在一起,但顯然這是不正確的。
如果我將所需的共享庫從主機複製到可執行文件存儲在目標上的目錄,程序仍然無法找到共享庫。如果我將所需的.so文件複製到目標上的/ usr/lib /文件夾中,該程序將只運行。運行可執行文件時搜索共享庫的文件夾是什麼?爲什麼它不能在自己的本地文件夾中找到共享庫?
隨着我添加更多的庫到我的項目中,管理它們並將它們放到目標上的最佳方式是什麼?我真的不想在我的主機上下載源代碼,交叉編譯爲arm,然後篩選生成的所有庫以僅傳輸。所以我需要在骨頭上的文件。爲目標只提供可執行文件所需的庫的正確方法是什麼?是否有工具/插件來管理或使此過程自動化?
無論我添加到eclipse鏈接器中的所有庫如何確定需要的庫是什麼?
如果我想告訴eclipse不使用共享庫,我該如何更改OpenCV,Curl和修改eclipse的編譯腳本,以便使用靜態庫呢?
在做嵌入式編程時,交叉編譯是使用共享庫還是靜態庫更爲典型?
感謝您的幫助。