Google 协议缓冲区交叉编译

Posted

技术标签:

【中文标题】Google 协议缓冲区交叉编译【英文标题】:Google protocol buffers cross compiling 【发布时间】:2011-12-27 17:58:18 【问题描述】:

我使用 Google 协议缓冲区的问题有两个部分,一个是关于编译器选项,另一个是交叉编译。构建机是Power6,64bit;主机是PowerPC450,32bit。 GCC 4.1.2。

第一个问题是关于编译器选项:

我正在尝试在需要交叉编译的 PowerPC 机器上安装 Google 协议缓冲区。构建机是Power6,64bit;主机是PowerPC450,32bit。 首先,我尝试直接安装在构建机器上,并带有告诉编译器使用哪个选项:

./configure --prefix=/home/where_to_install --host=powerpc-bgp-linux

然后make,make check,make install,一切都很好。我认为我已经指定了主机,它应该包含编译需要知道的足够信息。 当我尝试用

编译我的代码时
/bgsys/drivers/ppcfloor/gnu-linux/powerpc-bgp-linux/bin/g++ -g -zmuldefs -Xlinker -I/home/somewhere_installed/include $sourceFile -o $fileName -L/home/somewhere_installed/lib -lz -lstdc++ -lrt -lpthread -lm -lc -lprotobuf -lprotoc msg.pb.cc

我收到错误:

g++: unrecognized option '-zmuldefs'
In file included from zht_util.h:20,
                 from hash-phm.cpp:9:
meta.pb.h:9:42: error: google/protobuf/stubs/common.h: No such file or directory

并没有发现很多关于 common.h 中的变量的错误。

我知道这是因为编译器无法识别选项 -zmuldefs 所以找不到确实存在的文件 common.h。我用谷歌搜索并没有得到任何明确的想法。如何使编译器可以使用该选项或可以找到该文件?还是我的编译命令有什么问题?


第二个问题是关于交叉编译的。 Google 协议缓冲区的自述文件并不清楚交叉编译的精确度。它说我必须使用 --with-protoc=protoc 来告诉 configure 使用哪个,好的,但在此之前我必须为主机安装一个副本。我先使用命令为主机安装一个副本

./configure --prefix=/home/where_to_install/built --host=powerpc-bgp-linux

然后制作,制作安装。

然后与下面使用与主机使用相同的编译器进行交叉编译:

./configure --prefix=/home/tonglin/Installed/built_3 CC=/bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-gcc CXX=/bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-g++ --host=powerpc-bgp-linux --with-protoc=/home/where_already_Installed/built/bin/protoc

然后make报错:

很多编译信息...blabla.....

collect2: ld returned 1 exit status
make[3]: *** [protoc] Error 1
make[3]: Leaving directory `/gpfs/home/somewere/src/protobuf-2.4.1/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/gpfs/home/somewere/src/protobuf-2.4.1/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/gpfs/home/tonglin/Installed/src/protobuf-2.4.1'
make: *** [all] Error 2

我哪里做错了?我还尝试在第一次安装(对于主机)中使用指定的编译器,它得到了与上面第二次安装相同的错误。 一旦我成功完成安装,这里我将有两个安装,我应该使用哪个?有没有人可以给我一个如何交叉编译谷歌协议缓冲区的例子?我没有找到任何关于此的详细示例。

非常感谢,

-托尼

【问题讨论】:

我遇到了类似的问题...我正在通过 JNI 层将 ProtoBuf 库集成到 android 项目中。我正在关注教程CPP_ProtoBuf,但是在编译它时会产生类似的错误。 jni/./mysense/wrapper/addressbook.pb.h:9:42:致命错误:google/protobuf/stubs/common.h:没有这样的文件或导向器。这里有什么建议吗? 【参考方案1】:

我将尝试回答您的第二个问题:

当我交叉编译 protobuf 库时,我首先将它安装在我的主机上。这相对简单:

./configure --prefix=/usr
make
make check
make install

然后你应该让它在你的构建机器上运行。别忘了做一个

make distclean

之后或此编译中的工件将干扰下一次构建。

现在我通过配置为我的另一台机器(在构建机器上)构建它

./configure --host=ppc CC=powerpc-none-linux-gnuspe-gcc CXX=powerpc-none-linux-gnuspe-g++ --with-protoc=protoc --prefix=/path/to/built/files

然后执行通常的 make、make check 和 make install,您需要复制到另一台机器的文件在 /patch/to/built/files 中。

【讨论】:

感谢您的回答,但我无法直接访问主机,尽管它们与构建机器共享硬盘,所以我无法直接在它们上安装任何东西。我能做的是交叉编译它并在构建机器上安装主机版本。除了在主机上安装还有其他解决方案吗? 我不太明白。所以你可以访问你的构建机器,但不能访问你的主机?那么如何在主机上运行程序呢?如果你可以在那台机器上运行东西,你可以在共​​享驱动器上安装所有东西并在那里运行它们。 是的,那是一台大机器。我只能访问作为构建机器的头节点,并且可以通过使用 Cobalt 脚本来使用工作节点(主机)。工作节点不支持 Shell。 嗯好的。那么在你的构建机器上安装 protobuf 库可以吗?然后你做一个 make distclean 然后你用指向交叉编译库的最终目的地的前缀进行配置?然后make失败了? 是的,它失败了。你的意思是没有选项“--with-protoc”?【参考方案2】:

对于第一个问题,在你编译和安装 protobuf 库之后

./configure --prefix=/your_dir
make
make check
make install

您需要使用 -I 标志将 /your_dir/include 下的包含路径添加到您的 makefile 中,例如

-I/your_dir/include

.

【讨论】:

以上是关于Google 协议缓冲区交叉编译的主要内容,如果未能解决你的问题,请参考以下文章

如何交叉编译 MIPS?

RTSP/Onvif协议EasyNVR视频平台ARM版交叉编译过程及常见报错处理

交叉编译OpenSSL

NTP 4.2.8p9在cygwin下的交叉编译

Cygwin交叉编译openssl 1.1.0e版本

Linxux应用开发-串口下载命令rzsz交叉编译