2013-12-12 72 views
1

我正在使用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 

我的問題是:

  1. 看來我可以得到擺脫我的共享庫的錯誤通過將適當的庫從主機上的手臂編譯版本複製到目標上。所以目標也需要所有庫的副本以便程序運行。由於這些是共享庫,並且它們不包含在最終的可執行文件中,爲什麼我需要在主機上編譯目標平臺的源代碼以使主機鏈接程序開心?看起來在主機上永遠不會使用共享庫的arm編譯版本。我最初認爲這是因爲它們會與可執行文件打包在一起,但顯然這是不正確的。

  2. 如果我將所需的共享庫從主機複製到可執行文件存儲在目標上的目錄,程序仍然無法找到共享庫。如果我將所需的.so文件複製到目標上的/ usr/lib /文件夾中,該程序將只運行。運行可執行文件時搜索共享庫的文件夾是什麼?爲什麼它不能在自己的本地文件夾中找到共享庫?

  3. 隨着我添加更多的庫到我的項目中,管理它們並將它們放到目標上的最佳方式是什麼?我真的不想在我的主機上下載源代碼,交叉編譯爲arm,然後篩選生成的所有庫以僅傳輸。所以我需要在骨頭上的文件。爲目標只提供可執行文件所需的庫的正確方法是什麼?是否有工具/插件來管理或使此過程自動化?

  4. 無論我添加到eclipse鏈接器中的所有庫如何確定需要的庫是什麼?

  5. 如果我想告訴eclipse不使用共享庫,我該如何更改OpenCV,Curl和修改eclipse的編譯腳本,以便使用靜態庫呢?

  6. 在做嵌入式編程時,交叉編譯是使用共享庫還是靜態庫更爲典型?

感謝您的幫助。

回答

1
  1. 你只是讓連接器很高興在主機上有共享庫。它在共享庫中查找,以確保程序使用的符號得到解決。他們沒有聯繫或用於其他任何事情。
  2. /lib和/ usr/lib是尋找共享庫的平常地方。如果有某種/家/我/ LIB2

  3. 我不知道:

    SETENV LD_LIBRARY_PATH /家/我的/ lib目錄下:您可以通過定義PATH環境變量目錄添加到動態加載器的搜索路徑工具/插件。我使用scp。 ;-)

  4. ldd命令會告訴你可執行程序使用哪些共享庫。
  5. 好問題。我從來沒有建立過它們。軟件包通常會建立共享庫和靜態庫。
  6. 我不知道是否更典型的使用共享庫或不。我通常使用靜態庫。在我的ELLCC cross compiler project。我已經使用ELLCC來構建自己。生成的靜態鏈接可執行文件實際上比使用共享庫的gcc編譯可執行文件小。當然,這是與一組完全不同的C++和C標準庫。