写一个protobuf文件,编译后会生成两个文件一个.cc和一个.h文件。
export LD_LIBRARY_PATH=/usr/local/lib
protoc --cpp_out=./ forward_protobuf.proto
但是在cmakeList中编译时出现了状况。
from /mnt/hgfs/V2X_GT_code/parkingProject/appv_forward/src/appv_forward.cpp:4:
/mnt/hgfs/V2X_GT_code/parkingProject/appv_forward/src/../inc/../protoBuf/forward_protobuf.pb.h:10:40: fatal error: google/protobuf/port_def.inc: No such file or directory
compilation terminated.
此时需要查看自己想要运行的环境是X86架构还是arm架构
这个目录下是arm的库文件
这个目录下是X86的库文件
/usr/local/lib
/usr/lib
使用readelf -h 库文件 就可以查看到文件的架构
准备条件:
1.安装gcc编译器和make
2.安装arm-linux或其他arm编译器
可以用arm-linux-gcc -v和gcc -v来检查编译器版本。
从官网下载protobuf-2.5.0.tar.gz.
第一步是编译出x86版的库和protoc,
按顺序执行下列命令
tar -zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure
make
make check
sudo make install
这时已经编译出一个linux版的protobuf库和protoc, 这时需要开始来编arm版,因为下一步需要可以在linux上运行的protoc,所以上面的步骤不能少。
下面开始编译arm版
make clean
./configure --host=arm-linux --with-protoc=protoc
make
如果没有出错,那么arm版的库就编译出来了, 他们的位置是
protobuf-2.5.0/src/.libs/
使用readelf -h libprotobuf-lite.a来查看文件信息,如果对应machin值是ARM,那么就是大功告成了。
这样安装后库文件会生成在当前解压目录下的/src/.libs/下面
但是编译时会报错
修改目录 #目录需要根据自己的实际情况来写。
./configure --prefix=/opt/genvict-imx-fb/4.1.15-1.2.1/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr --host=arm-linux --with-protoc=protoc
make #安装
这样的话,再编译就不会报错了
需要分清包含的库文件是静态库还是动态库
#cmake verson
cmake_minimum_required(VERSION 2.8)
#add gdb
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
#project name
project(v2x_pad_OBU_can)
#include cmake file
include(../toolchain.cmake)
#compile parameter
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
#set output path
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#head file path
include_directories(
inc
../libcomsocket/inc
../libv2xgeneral/inc
../libv2xgeneral/inc/msg
../libv2xgeneral/inc/codec
../libv2xgeneral/inc/rapidjson
_install/include
)
#source directory
aux_source_directory(src SRC_LIST)
#link directory
link_directories(
../../libcomsocket/lib
../../libv2xgeneral/lib
../_install/lib
../lib
)
#add executable file
add_executable(${PROJECT_NAME} ${SRC_LIST})
#add link library
target_link_libraries(${PROJECT_NAME} comsocket v2xgeneral pthread paho-mqtt3as libprotobuf.a libprotoc.a)
静态库需要把名字写全
动态库可以把前面的lib和后面的 .so后缀去掉。