2017-04-16 123 views
0

我正在使用Ubuntu Linux,Eclipse Neon和arm-linux-gnueabihf工具鏈交叉編譯Raspberry Pi的應用程序。 Eclipse通常適用於此。我通常能夠交叉編譯和鏈接應用程序,將其分配給RPi,然後在RPi上運行。在Eclipse中使用gnueabihf交叉工具鏈鏈接CGICC

我最近需要添加CGICC庫。我首先在Pi上安裝了庫,然後構建了一個簡單的C++應用程序,在RPi上構建並運行它,沒有任何問題。這表示該庫已正確安裝在RPi上。

然後,我想將庫複製到Linux機器上,以便在Linux機器上開發應用程序以在RPi上運行時使用它。所以我將RPi中的以下文件複製到Linux機器上:

從Linux機器上的RPi到/ usr/arm-linux-gnueabihf/include的/ usr/include/cgicc文件夾。這將RPi中的28個文件複製到位於/ usr/arm-linux-gnueabihf/include中的新CGICC文件夾中。 linux機器現在應該有所有的包含文件。

/usr/lib/libcgicc*.*在Linux機器上從RPi到/ usr/arm-linux-gnueabihf/lib文件(3個文件)。 RPi也有2個符號鏈接。我在Linux機器上創建了符號鏈接。在這一點上,似乎庫已經從RPi遷移到Linux機器。

在Eclipse我創建了一個簡單的項目:

#include <iostream> 
#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std; 
using namespace cgicc; 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 

    Cgicc formData; 
    form_iterator fChannel = formData.getElement("servochannel"); 

    if (fChannel != (*formData).end() && !fChannel->isEmpty()) { 
     int channelNumber = atoi(fChannel->getValue().c_str()); 
    } 

    return 0; 
} 

我設置項目屬性如下: C/C++編譯/設置/交叉G ++編譯器/包括到/ usr /臂-Linux的gnueabihf /包括。 C/C++構建/設置/跨G ++鏈接器/庫到cicc和庫搜索路徑到/ usr/arm-linux-gnueablihf/lib。

Cross G++ Compiler Includes Settings Gross G++ Linker Libraries Settings

當我建一個項目,該項目編譯但鏈接拋出兩個錯誤消息:

未定義參考cgicc::Cgicc::getElement undefined reference to cgicc :: FormEntry ::的getValue

它不抱怨源文件「Cgicc formData;」中的行但它確實抱怨與CGICC有關的其他每一行。

那麼我做錯了什麼?我一直在爲此爭取一週,搜索堆棧溢出和其他地方。我希望這裏有人能幫助我。我厭倦了編輯,構建和測試RPi。

回答

0

解決方案找到了!

問題是RPi上的庫是用不同版本的gcc編譯器編譯的,而不是在Eclipse機器上編譯的。 RPi版本無法更新到Eclipse機器上的較新版本,反之亦然。這意味着編譯代碼和庫之間的接口可能不兼容,導致我遇到的庫問題。

解決方案是將最新版本的cgicc庫下載到Eclipse機器上,並使用armhf交叉編譯器構建庫。這會在RPi和開發機器上放置相同版本的庫。

由於cgicc使用Automake的,正確的命令如下:

./configure CXX=arm-linux-gnueabihf-g++ libdir=/usr/cgicc/lib includedir=/usr/cgicc/include 
make 
sudo make install 

然後Eclipse中必須配置爲尋找位於/ usr/cgicc/include和/ usr/cgicc的文件和庫文件/ lib文件夾。

之後,我是能夠建立我的應用程序,它使用scp對RPI的/ usr/lib目錄的/ cgi-bin文件夾,然後運行它。