jay*_*jay 5 c++ cmake cross-compiling yocto grpc
我正在开发一个使用 gRPC 的 C++ 组件,并在我的位库配方 (Yocto ) 中使用以下定义来dunfell使用 CMake 构建它:
DEPENDS += "\
grpc \
grpc-native \
...
"
inherit cmake pkgconfig
Run Code Online (Sandbox Code Playgroud)
我添加了grpc-native能够使用protoc编译器生成存根并将grpc我的组件与目标主机的 gRPC 库链接的功能。
在我的 CMakeLists.txt 中,我使用以下 CMake 函数来查找库/cpp-plugin
find_package(Protobuf REQUIRED)
find_package(gRPC CONFIG REQUIRED)
find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin REQUIRED)
Run Code Online (Sandbox Code Playgroud)
但是,构建配方失败并出现以下错误:
| CMake Error at /home/jayjay/build-master/build/tmp/work/corei7-64-mbient-linux/mycomponent/git-r0/recipe-sysroot/usr/lib/cmake/grpc/gRPCTargets.cmake:197 (message):
| The imported target "gRPC::grpc_cpp_plugin" references the file
|
| "/home/jayjay/build-master/build/tmp/work/corei7-64-mbient-linux/mycomponent/git-r0/recipe-sysroot/usr/bin/grpc_cpp_plugin"
|
| but this file does not exist.
Run Code Online (Sandbox Code Playgroud)
确实,grpc_cpp_plugin该目录中不存在 ,以及所有其他插件grpc_node_plugin,例如grpc_php_plugin, 等。但是,这些插件存在于相应的“recipe-sysroot -native/usr/bin/”目录中,这是正确的,因为它们必须针对构建主机(而不是目标主机)进行编译,以便它们可以用于protoc生成存根。
我不明白的是,为什么检查这些插件文件的存在,尽管它们没有创建?
如果我grpc从中删除DEPENDS,那么一切都会正常工作,除非构建主机架构与目标主机架构不同(即交叉编译)。在这种情况下,我收到链接器错误“文件格式错误”,这没关系,因为我使用的是为构建主机(grpc-native)而不是目标主机编译的库。
作为解决方法,我只需在所需目录中创建所有必需的插件文件,如下所示:
do_configure_prepend() {
touch ${STAGING_BINDIR}/grpc_cpp_plugin
touch ${STAGING_BINDIR}/grpc_csharp_plugin
touch ${STAGING_BINDIR}/grpc_node_plugin
...
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为只检查文件是否存在。它们没有被使用。
为了能够使用“本机”插件找到目录的正确位置,我将以下额外参数传递给 CMake:
EXTRA_OECMAKE = "\
-DSTAGING_BINDIR_NATIVE=${STAGING_BINDIR_NATIVE} \
"
Run Code Online (Sandbox Code Playgroud)
不用说,这感觉不对。
我真的不明白我在这里做错了什么(很抱歉解释很长)?
小智 2
解决方案很简单:使用 kirkstone
在 Dunfell 上,gRPC 配方不包括https://github.com/grpc/grpc/pull/31525,我相信它修复了 Yocto 上的构建。因此从技术上讲,您也可以只更新/修补/制作自己的 gRPC 配方。