首页 > 解决方案 > 使用 cmake 交叉编译使用 ProtoBuf 的项目

问题描述

我正在尝试将协议缓冲区添加到交叉编译到 ARM 的 cmake 构建中。这是一个定制板,不可能在目标上构建,我必须能够交叉编译。

我遇到的问题是要获取 .proto 文件并生成 x.pb.c 文件,我需要使用 protoc 的主机版本及其库,但是当我使用生成的 x.pb.c 时源文件 我需要使用 ARM 版本的库来构建我的应用程序。如果我不这样做,我会在链接时收到以下错误:

/usr/bin/ld.lld-5.0: error: /usr/local/lib/libprotobuf.so is incompatible with armelf_linux_eabi

错误是正确的,因为文件位于:

/usr/local/lib/libprotobuf.so 

是主机版本而不是 ARM 版本。手臂版本位于:

/mnt/c/zprotocol/linux_arm/lib/libprotobuf.so

我生成 x.pb.c 文件时的 cmake 文件是:

cmake_minimum_required( VERSION 3.5 )
project( base )

set( CMAKE_CXX_STANDARD 11 )

include( FindProtobuf )
find_package( Protobuf REQUIRED )
include_directories( ${PROTOBUF_INCLUDE_DIR} )

protobuf_generate_cpp( PROTO_SRC PROTO_HEADER test.proto )

add_library( proto ${PROTO_HEADER} ${PROTO_SRC} )
target_link_libraries( proto ${PROTOBUF_LIBRARIES} )

这一切都很好,我生成的文件没有问题。我不知道如何告诉 cmake 在链接使用生成的协议缓冲区文件的应用程序时,它需要在不同的路径中查找。

我认为 find_package 以某种方式为整个构建设置路径。我尝试通过以下方式在使用生成协议文件的应用程序的 cmake 文件中添加适当的路径:

include_directories( /mnt/c/zprotocol/linux_arm/lib/ )

set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L /mnt/c/zprotocol/linux_arm/lib" )

没有成功。

有人有我可以尝试的建议吗?我还在学习 cmake,所以也许有一些我还没有弄清楚的明显的东西。

谢谢!

标签: c++cmakeprotocol-buffers

解决方案


推荐阅读