使用cmake交叉编译gRPC

时间:2018-09-06 10:51:48

标签: c++ cmake cross-compiling grpc

我正在尝试使用cmake交叉编译gRPC。

我实际上设法做到了。不幸的是,我的方法涉及修补CMakeLists.txt。

问题是,当我尝试编译gRPC时,它使用的是他刚刚编译的protobuffer。它无法在x86计算机上运行ARM编译的可执行文件。

我设法通过在gRPCs主CMakeLists.txt中手动指定protoc和grpc_cpp_plugin的路径来对其进行编译。它很脏,并且由于我想将gRPC作为子模块包含在内,因此我需要干净的方法来做到这一点。

有人使用cmake交叉编译gRPC吗?

1 个答案:

答案 0 :(得分:3)

这种方法应该起作用:

  1. 针对目标(ARM)交叉编译Protobuf并安装它。

    确保可以在您拥有的工具链(ARM)中搜索交叉编译的Protobuf。 例如。它安装在sysroot下的system-default前缀中。

  2. 在主机上,安装相同版本的Protobuf 。它不必是可搜索的(也就是说,用户本地安装就足够了。)

  3. 使用以下参数交叉编译gRPC(在CMake GUI中设置,或作为-D可执行文件的cmake选项设置):

    • gRPC_PROTOBUF_PROVIDER:程序包
    • gRPC_PROTOBUF_PACKAGE_TYPE:MODULE
    • Protobuf_PROTOC_EXECUTABLE:<主机protoc可执行文件的路径>

说明

将参数gRPC_PROTOBUF_PROVIDER设置为“ package”会告诉gRPC不要构建自己的Protobuf,而是使用已经安装的变体。 find_package(Protobuf)搜索此变体。

将参数gRPC_PROTOBUF_PACKAGE_TYPE设置为“ MODULE”告诉gRPC不要使用Protobuf安装提供的“ Config”文件来检测Protobuf事物(库和可执行文件)。配置文件包含无法在外部调整的硬编码路径。而是使用FindProtobuf.cmake脚本来查找Protobuf。

设置参数Protobuf_PROTOC_EXECUTABLE告诉FindProtobuf.cmake脚本不搜索Protobuf可执行文件,而是从参数中获取它。