目录
1、问题描述
arm环境下通过find_package寻找protobuf库,使用PROTOBUF_GENERATE_CPP将proto文件生成对应的*.pb.h、*.pb.cc文件失败
2、问题原因
在进行交叉编译时,已配置交叉编译环境,系统会默认去配置的路径下查找对应的protobuf库,因为arm版本的库在linux环境下无法使用,顾出现上述问题
3、解决办法
编译环境下配置两套protobuf库,一套linux类型的protobuf库,一套通过arm生成的protobuf库,交叉编译时使用arm类型的protobuf库,在进行find_package时可通过将CMAKE_FIND_ROOT_PATH_MODE_PROGRAM设置成NEVER,find_package运行完成后在将其设置成ONLY即可
sdk中包含的arm版本的protobuf库,若无SDK可下载protobuf源码自己编译即可
Linux版本的protobuf库
如何在编译arm的过程中调用linux版本的protobuf库,见下图
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER
4、Demo验证
CMakeLists.txt如下
project(Test)
cmake_minimum_required(VERSION 3.18)
# 设置二进制名字
set(BIN_NAME Test)
# 添加源文件
aux_source_directory(./ DIR_MAIN)
SET(ALL_SRCS
${DIR_MAIN}
)
set(AOS_SDK_PATH "指定sdk路径") #指定SDK路径
set(CMAKE_CROSSCOMPILING TRUE)
set(TOOLCHAIN_PATH ${AOS_SDK_PATH})
set(CMAKE_SYSROOT "${TOOLCHAIN_PATH}/aos/sysroot")
set(BUILD_SYSROOT "${TOOLCHAIN_PATH}/aos/sysroot")
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/aos/bin/clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/aos/bin/clang++)
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_FIND_ROOT_PATH "${TOOLCHAIN_PATH}")
# Build flags
set(CMAKE_C_FLAGS
${CMAKE_C_FLAGS}
${TOOLCHAIN_DEFAULT_C_FLAGS}
)
set(CMAKE_CXX_FLAGS
${CMAKE_CXX_FLAGS}
${TOOLCHAIN_DEFAULT_CXX_FLAGS}
)
# Link flags
set(CMAKE_C_LINK_FLAGS
${CMAKE_C_LINK_FLAGS}
${TOOLCHAIN_DEFAULT_C_LINK_FLAGS}
)
set(CMAKE_CXX_LINK_FLAGS
${CMAKE_CXX_LINK_FLAGS}
${TOOLCHAIN_DEFAULT_CXX_LINK_FLAGS}
)
# Project build settings
set(TARGET_SYSTEM_NAME EulerOS)
set(TARGET_ARCH aarch64)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
find_package(Protobuf REQUIRED)
if(PROTOBUF_FOUND)
message(STATUS "protobuf library found")
else()
message(FATAL_ERROR "protobuf library is needed but cant be found")
endif()
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
#======================proto文件====================
set(proto_dir ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB proto_files "${proto_dir}/test.proto")
message(STATUS "Proto Source Dir: ${proto_dir}")
message(STATUS "Proto Source Files: ${proto_files}")
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${proto_files})
#======================proto文件====================
add_executable(${BIN_NAME} ${ALL_SRCS} ${PROTO_SRCS} ${PROTO_HDRS})
find_library(PROTOBUF_LIBRARY1 NAMES protobuf PATHS /home/faw/SDK/aos/sysroot/usr/lib64 NO_DEFAULT_PATH)
# 链接动态库
target_link_libraries(${BIN_NAME}
PRIVATE
pthread
${PROTOBUF_LIBRARY1}
)
终端界面显示结果如下:
root@3dbbf7327118:/home/fa/codepath/test# tree
.
|-- CMakeLists.txt
|-- build
|-- test.cpp
`-- test.proto
1 directory, 3 files
root@3dbbf7327118:/home/fa/codepath/test# cd build/
root@3dbbf7327118:/home/fa/codepath/test/build# cmake ../
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Protobuf: /usr/local/lib/libprotobuf.so (found version "3.12.3")
-- protobuf library found
-- Proto Source Dir: /home/fa/codepath/test
-- Proto Source Files: /home/fa/codepath/test/test.proto
-- Configuring done
-- Generating done
-- Build files have been written to: /home/fa/codepath/test/build
root@3dbbf7327118:/home/fa/codepath/test/build# make
[ 25%] Running cpp protocol buffer compiler on /home/fa/codepath/test/test.proto
Scanning dependencies of target Test
[ 50%] Building CXX object CMakeFiles/Test.dir/test.cpp.o
[ 75%] Building CXX object CMakeFiles/Test.dir/test.pb.cc.o
[100%] Linking CXX executable Test
[100%] Built target Test
root@3dbbf7327118:/home/fa/codepath/test/build# file Test
Test: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0 , with debug_info, not stripped
protobuf库如何安装见:源码编译安装Protobuf [linux、arm]_无名 小卒的博客-CSDN博客