一文读懂 非root用户正确编译安装 protobuf —— 附 CMakeLists.txt 配置

举报
墨理学AI 发表于 2022/01/11 01:20:21 2022/01/11
【摘要】 ❤️ protobuf 如果没有正确编译安装和使用,很容易遇到一堆的相关依赖报错 ❤️ 本文带大家有效解决 C++ 工程中 正确编译安装和使用 protobuf 💙 总之,这篇...

❤️ protobuf 如果没有正确编译安装和使用,很容易遇到一堆的相关依赖报错


❤️ 本文带大家有效解决 C++ 工程中 正确编译安装和使用 protobuf


💙 总之,这篇博文写了很久,笔者认为它很强,建议直接三连


💙 友情提示:本博文,仅供参考,转载务必经博主同意,敬请查阅


📔 基础GCC环境


小伙伴直接参考如下博文即可

0-0


📗 protobuf 下载


1-0


📕 protobuf 普通用户安装


protobuf 默认安装的时候,configure使用的是使用动态链接库的方式进行安装和使用


这里首先使用默认的安装方式

创建一个 安装目录 /home/moli/usr/local/protobuf

./configure --prefix=/home/moli/usr/local/protobuf

make -j

# make check 命令执行太久(据说 5-60 分钟),因为之前有安装成功的经验,我这里就没有执行这条命令了
# 总之,这个命令不执行,通常也没关系
make check

make install

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

make -j 输出成功如下:


...

  CXXLD    libprotobuf-lite.la
  CXXLD    libprotobuf.la
  CXXLD    libprotoc.la
  CXXLD    protoc
make[2]: Leaving directory '/home/moli/project/project21Next/modelTrans/ncnnInstall/protobuf-3.19.1/src'
make[1]: Leaving directory '/home/moli/project/project21Next/modelTrans/ncnnInstall/protobuf-3.19.1'


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

make install 输出成功如下:

make[2]: Leaving directory '/home/moli/project/project21Next/modelTrans/ncnnInstall/protobuf-3.19.1/src'
make[1]: Leaving directory '/home/moli/project/project21Next/modelTrans/ncnnInstall/protobuf-3.19.1/src'


  
 
  • 1
  • 2
  • 3

cd /home/moli/usr/local/protobuf


进入安装目录,我们看一看,make install 最终安装了什么

  • bin 目录下,是 protoc 可执行程序
  • include 目录下,是相关头文件
  • lib 目录下,是静态库

如果是其他 C++ 项目需要,那么只需 copy 或者 指定 我们安装目录 /home/moli/usr/local/protobuf 下的这些文件即可

tree
.
├── bin
│   └── protoc
├── include
│   └── google
│   ...
│   ...  
└── lib
    ├── libprotobuf.a
    ├── libprotobuf.la
    ├── libprotobuf-lite.a
    ├── libprotobuf-lite.la
    ├── libprotobuf-lite.so -> libprotobuf-lite.so.30.0.1
    ├── libprotobuf-lite.so.30 -> libprotobuf-lite.so.30.0.1
    ├── libprotobuf-lite.so.30.0.1
    ├── libprotobuf.so -> libprotobuf.so.30.0.1
    ├── libprotobuf.so.30 -> libprotobuf.so.30.0.1
    ├── libprotobuf.so.30.0.1
    ├── libprotoc.a
    ├── libprotoc.la
    ├── libprotoc.so -> libprotoc.so.30.0.1
    ├── libprotoc.so.30 -> libprotoc.so.30.0.1
    ├── libprotoc.so.30.0.1
    └── pkgconfig
        ├── protobuf-lite.pc
        └── protobuf.pc

18 directories, 146 files


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

📙 protobuf 编译安装静态链接库


创建一个 安装目录 /home/moli/usr/local/protobufStatic


./configure CFLAGS="-fPIC" CXXFLAGS="-fPIC" --prefix=/home/moli/usr/local/protobufStatic  --disable-shared

make -j

make install

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

看看这次 make install 最终安装了什么

cd protobufStatic/

# 只查看 2层 目录文件即可

tree -L 2

.
|-- bin
|   `-- protoc
|-- include
|   `-- google
`-- lib
    |-- libprotobuf-lite.a
    |-- libprotobuf-lite.la
    |-- libprotobuf.a
    |-- libprotobuf.la
    |-- libprotoc.a
    |-- libprotoc.la
    `-- pkgconfig

5 directories, 7 files


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

1-5


📘 C++ 工程中正确编译使用 protobuf


🔴 方式一:

通过 CMakeLists.txt set( PROTOBUF_DIR path ) 配置 protobuf | 通常难以找到自己安装的这个


CMakeLists.txtfind_package(Protobuf) 默认会找到 系统安装的 protobuf


原因如下:

1-6

CMakeLists.txt 中如何有效配置使指向自己安装的 protobuf ,还望大佬评论区指路

SET(PROTOBUF_DIR /home/moli/usr/local/protobufStatic/)

find_package(Protobuf REQUIRED)

if(PROTOBUF_FOUND)
    message("Protobuf_INCLUDE_DIRS ——— onnxCMakeLists:" ${PROTOBUF_INCLUDE_DIR})
    message("PROTOBUF_LIBRARIES ——— onnxCMakeLists:" ${PROTOBUF_LIBRARIES})
    message("______________________________________________________")
    
    ...
    ...
else()
    message(WARNING "Protobuf not found, won't be built  success")
endif()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

cmake .. 编译找到系统安装的 protobuf 输出如下

-- Found Protobuf: /usr/local/lib/libprotobuf.so;-lpthread (found version "3.17.3") 

Protobuf_INCLUDE_DIRS ——— onnxCMakeLists:/usr/local/include
PROTOBUF_LIBRARIES ——— onnxCMakeLists:/usr/local/lib/libprotobuf.so-lpthread


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

🔴 方式二【当前有效】

C++工程编译时,可以使用 cmake -DCMAKE_PREFIX_PATH= 来指定使用自己安装的 protobuf

cmake -DCMAKE_PREFIX_PATH=/home/moli/usr/local/protobuf -DCMAKE_INSTALL_PREFIX=./install ..

  
 
  • 1

可以成功找到我们刚刚编译安装的 protobuf 3.19.1

-- Found Protobuf: /home/moli/usr/local/protobufStatic/lib/libprotobuf.a;-lpthread (found version "3.19.1") 
Protobuf_INCLUDE_DIRS ——— onnxCMakeLists:/home/moli/usr/local/protobufStatic/include
PROTOBUF_LIBRARIES ——— onnxCMakeLists:/home/moli/usr/local/protobufStatic/lib/libprotobuf.a-lpthread


  
 
  • 1
  • 2
  • 3
  • 4

🔴 添加 protobuf 依赖示例

生成得到 动态库、静态库时,进行链接 、示例如下

set(file_srcs  src/molixueAI.cpp)

add_library(molixueAI SHARED ${file_srcs} )

# 可执行目标文件,添加 protobuf  依赖

target_include_directories(molixueAI
PUBLIC
    ${PROTOBUF_INCLUDE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR})

target_link_libraries(molixueAI PUBLIC  ${PROTOBUF_LIBRARIES})

INSTALL(TARGETS molixueAI 
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION libstatic
)
INSTALL(FILES include/molixueAI.h DESTINATION include)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

💬 人生苦短,欢迎和墨理一起学AI


💙 一文学会深度学习环境搭建,下面这一篇就能帮助各位有效入门 💙

❤️ 墨理学AI 博客尚有若干精品干货专栏、各位可按需查阅,感谢支持 ❤️

9-6

文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。

原文链接:positive.blog.csdn.net/article/details/121486877

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。