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

本文详细介绍了如何在C++工程中正确编译安装protobuf,包括普通动态库安装、静态链接库构建,并提供了解决常见依赖问题的方法。重点讲解了通过CMake配置和指定安装路径以使用自定义protobuf版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

❤️ 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

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'

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'

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


📙 protobuf 编译安装静态链接库


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


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

make -j

make install

看看这次 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-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()

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

🔴 方式二【当前有效】

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

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

可以成功找到我们刚刚编译安装的 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

🔴 添加 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)

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


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

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

9-6

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨理学AI

不必打赏,关注博主公众号即可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值