cmakeList编译protobuf.pb.h时报错fatal error: google/protobuf/port_def.inc: No such file or directory

写一个protobuf文件,编译后会生成两个文件一个.cc和一个.h文件。

export LD_LIBRARY_PATH=/usr/local/lib

protoc --cpp_out=./ forward_protobuf.proto

单独的编译命令:g++ -o pub_boche2.out publish_boche.cpp protoBuf/forward_protobuf.pb.cc -lprotobuf -lpthread -std=c++11 -lpaho-mqtt3as

但是在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的库文件

/opt/genvict-imx-fb/4.1.15-1.2.1/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/lib

 

这个目录下是X86的库文件

/usr/local/lib

/usr/lib

使用readelf -h 库文件 就可以查看到文件的架构

 

linux系统上编译arm版的protobuf库

 

准备条件:

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/下面

 

解决方法:重新添加配置到你的交叉编译工具链(arm)所在的目录,如果是X86架构的那么不需要

但是编译时会报错

修改目录 #目录需要根据自己的实际情况来写。

 ./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后缀去掉。

你可能感兴趣的:(c++)