【Cmake/Protobuf】交叉编译时,cmake中使用find_package失败问题

目录

1、问题描述

2、问题原因

3、解决办法

4、Demo验证


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博客

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值