記一次grpc arm-hisiv400-linux交叉編譯
時間緊,先大概說明一下,有時間了再補充詳細的說明
grpc 交叉編譯 需要先編譯出pc版的protobuff 和 grpc,安裝到指定的路徑,在做交叉編譯時需要protoc 和grpc_cpp_plugin工具。這兩個工具也也是在編譯時會生成,交叉編譯過程中要遮蔽掉使用交叉編譯後的工具。
先上配置
#! /bin/sh
export HOST=arm-hisiv400-linux export CROSS=arm-hisiv400-linux- export CC=${CROSS}gcc export AR=${CROSS}ar export CPP=${CROSS}cpp export CXX=${CROSS}g++ export STRIP=${CROSS}strip export RANLIB=${CROSS}ranlib
export CFLAGS=-I$PWD/build/include export LDFLAGS=-L$PWD/build/lib export PREFIX=$PWD/build export SYS_INCLUDE_ROOT=/opt/hisi-linux/x86-arm/arm-hisi400-linux/target
cd grpc-1.14.1 ./build.sh && make clean && make && make install cd -
CMakeLists.txt.pre 我將原始的CMakeLists.txt備份成了CMakeLists.txt.pre
sed指令為了使用x86 平臺上的工具
cp ./CMakeLists.txt.pre ./CMakeLists.txt;\ rm CMakeCache.txt; \ sed -i 's/$<TARGET_FILE:grpc_cpp_plugin>/\.\.\/build\/x86\/bin\/grpc_cpp_plugin/g' CMakeLists.txt; cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${PREFIX} \ -DCMAKE_INSTALL_LIBDIR=${PREFIX}/lib \ -DCMAKE_FIND_ROOT_PATH=${PREFIX} \ -DTARGET_LINK_LIBRARIES:STRING=${PREFIX}/lib \ -DLINK_LIBRARIES:STRING=${PREFIX}/lib \ -DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX} \ -DgRPC_ZLIB_PROVIDER:STRING=package \ -DgRPC_CARES_PROVIDER:STRING=package \ -Dc-ares_DIR:PATH=${PREFIX}/lib/cmake/c-ares \ -DgRPC_PROTOBUF_PROVIDER:STRING=package \ -DgRPC_PROTOBUF_PACKAGE_TYPE:STRINGS=MODULE \ -DOPENSSL_LIBRARIES=${PREFIX}/lib \ -DOPENSSL_INCLUDE_DIR=${PREFIX}/include \ -DgRPC_SSL_PROVIDER:STRING=package \ -DgRPC_GFLAGS_PROVIDER:STRING=package \ -DPROTOBUF_PROTOC_EXECUTABLE:FILEPATH=/usr/local/bin/protoc \ -DgRPC_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS:BOOL=ON
編譯到48%報錯如下
[ 48%] Built target grpc_unsecure [ 48%] Linking C executable check_epollexclusive /opt/hisi-linux/x86-arm/arm-hisiv400-linux/bin/../lib/gcc/arm-hisiv400-linux-gnueabi/4.8.3/../../../../arm-hisiv400-linux-gnueabi/bin/ld: warning: libstdc++.so.6, needed by libgrpc.so, not found (try using -rpath or -rpath-link) libgrpc.so:對‘[email protected]_ARM_1.3.3’未定義的引用 libgrpc.so:對‘vtable for __cxxabiv1::[email protected]_1.3’未定義的引用 libgrpc.so:對‘[email protected]_1.3’未定義的引用 libgrpc.so:對‘[email protected]_1.3’未定義的引用 libgrpc.so:對‘vtable for __cxxabiv1::[email protected]_1.3’未定義的引用 collect2: error: ld returned 1 exit status CMakeFiles/check_epollexclusive.dir/build.make:101: recipe for target 'check_epollexclusive' failed make[2]: *** [check_epollexclusive] Error 1 CMakeFiles/Makefile2:419: recipe for target 'CMakeFiles/check_epollexclusive.dir/all' failed make[1]: *** [CMakeFiles/check_epollexclusive.dir/all] Error 2 Makefile:116: recipe for target 'all' failed make: *** [all] Error 2
將
CMakeLists.txt中 如下部分遮蔽掉
#add_executable(check_epollexclusive # test/build/check_epollexclusive.c #) # # #target_include_directories(check_epollexclusive # PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} # PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include # PRIVATE ${_gRPC_SSL_INCLUDE_DIR} # PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR} # PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR} # PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR} # PRIVATE ${_gRPC_CARES_INCLUDE_DIR} # PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR} # PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} # PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR} #) # #target_link_libraries(check_epollexclusive # ${_gRPC_ALLTARGETS_LIBRARIES} # grpc # gpr #) #