我正在尝试将协议缓冲区添加到可以交叉编译到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,所以也许有些明显的东西我还没有弄清楚。
谢谢!