一文读懂 非root用户正确编译安装 protobuf —— 附 CMakeLists.txt 配置
❤️ protobuf 如果没有正确编译安装和使用,很容易遇到一堆的相关依赖报错
❤️ 本文带大家有效解决 C++ 工程中 正确编译安装和使用 protobuf
💙 总之,这篇博文写了很久,笔者认为它很强,建议直接三连
💙 友情提示:本博文,仅供参考,转载务必经博主同意,敬请查阅
📔 基础GCC环境
小伙伴直接参考如下博文即可
📗 protobuf 下载
📕 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
📘 C++ 工程中正确编译使用 protobuf
🔴 方式一:
通过
CMakeLists.txt
set( PROTOBUF_DIR path )
配置protobuf
| 通常难以找到自己安装的这个
CMakeLists.txt
中find_package(Protobuf)
默认会找到系统安装的 protobuf
原因如下:
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 博客尚有若干精品干货专栏、各位可按需查阅,感谢支持 ❤️
文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。
原文链接:positive.blog.csdn.net/article/details/121486877
- 点赞
- 收藏
- 关注作者
评论(0)