使用gnueabihf交叉工具链在Eclipse中链接CGICC

时间:2017-04-16 18:33:47

标签: c++ eclipse cgi

我正在使用Ubuntu Linux,Eclipse Neon和arm-linux-gnueabihf工具链来交叉编译Raspberry Pi的应用程序。 Eclipse通常适用于此。我通常能够交叉编译和链接应用程序,将其scp到RPi,并在RPi上运行它。

我最近需要添加CGICC库。我首先在Pi上安装了库,然后构建了一个简单的c ++应用程序,在RPi上构建并运行它没有任何问题。这表示库已正确安装在RPi上。

然后我想将库复制到Linux机器上,这样我就可以在Linux机器上进行开发,以便在RPi上运行应用程序。所以我将以下文件从RPi复制到Linux机器:

从RPi到/ usr / arm-linux-gnueabihf / include的

/ usr / include / cgicc文件夹在Linux机器上。这将28个文件从RPi复制到位于/ usr / arm-linux-gnueabihf / include中的新CGICC文件夹。 linux机器现在应该包含所有包含文件。

在Linux机器上从RPi到/ usr / arm-linux-gnueabihf / lib的

/ usr / lib / libcgicc *。*文件(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 / arm-linux-gnueabihf / include。 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

的未定义引用

它没有抱怨源文件中的行&#34; Cgicc formData;&#34;但它确实抱怨与CGICC有关的所有其他线路。

那么我做错了什么?我已经打了一个星期了,搜索堆栈溢出和其他地方。我希望这里有人可以帮助我。我厌倦了对RPi进行编辑,构建和测试。

1 个答案:

答案 0 :(得分: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文件夹中查找include和library文件。

之后我能够构建我的应用程序,将其scp到RPi上的/ usr / lib / cgi-bin文件夹,然后运行它。