我正在使用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。
当我构建项目时,项目会编译,但链接器会抛出两条错误消息:
对cgicc::Cgicc::getElement
undefined reference to
cgicc :: FormEntry :: getValue
它没有抱怨源文件中的行&#34; Cgicc formData;&#34;但它确实抱怨与CGICC有关的所有其他线路。
那么我做错了什么?我已经打了一个星期了,搜索堆栈溢出和其他地方。我希望这里有人可以帮助我。我厌倦了对RPi进行编辑,构建和测试。
答案 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文件夹,然后运行它。