文章目录
安装 autoconf automake libtool curl make g++ unzip
sudo apt-get install autoconf automake libtool curl 1 make g++ unzip -y
可能需要添加清华源:
-
更新软件包列表并安装需要的软件包:
首先,将系统的包列表更新为清华大学的镜像源,然后安装所需的软件包。 -
更换为清华源:
你可以通过编辑sources.list
文件来将镜像源更换为清华源。使用以下命令编辑sources.list
文件:sudo nano /etc/apt/sources.list
将文件中的内容替换为以下清华源:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
保存并关闭文件 (
Ctrl+O
,Enter
,Ctrl+X
)。 -
更新包列表:
使用以下命令更新软件包列表:sudo apt-get update
-
安装所需的软件包:
使用以下命令安装所需的软件包:sudo apt-get install autoconf automake libtool curl make g++ unzip -y
下载 ProtoBuf 编译器
下载地址:[https://github.com/protocolbuffers/protobuf/releases]
# 第一步执行autogen.sh,但如果下载的是具体的某一门语言,不需要执行这一步。
./autogen.sh
# 第二步执行configure,有两种执行方式,任选其一即可,如下:
# 1、protobuf默认安装在 /usr/local 目录,lib、bin都是分散的
./configure
# 2、修改安装目录,统一安装在/usr/local/protobuf下
./configure --prefix=/usr/local/protobuf
make // 执行15分钟左右
make check // 执行15分钟左右
sudo make install
有些同学可能会在make check 出现错误,例如:
出现以上错误的原因是test的模块里面有非常多的测试用例,这些用例对服务器环境要求特别严格,需要增大下swap分区,具体操作可参考:
https://blog.csdn.net/AlexWang30/article/details/90341172
(建议可以先扩大3G,再执行 make check 。如果还是报错,再扩大到10G重新执行 make
check )执行 make check 后 ,出现以下内容就可以执行 sudo make install 。
到此,需要你回忆一下在执行configure时,如果当时选择了第一种执行方式,也就是
./configure ,那么到这就可以正常使用protobuf了。如果选择了第二种执行方式,即修改了安装
目录,那么还需要在/etc/profile 中添加一些内容:
sudo vim /etc/profile
# 添加内容如下:
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
最后一步,重新执行 /etc/profile 文件:
source /etc/profile
检查是否安装成功
输入 protoc --version
查看版本,有显示说明安装成功:
which protoc
这个命令的作用是查找 protoc
可执行文件的路径。例如,如果 protoc
可执行文件位于 /usr/local/bin/protoc
,那么 which protoc
将返回这个路径。
ldd $(which protoc)
这个命令由两部分组成:
-
$(which protoc)
:
这个部分是一个命令替换,表示先执行which protoc
,然后将其输出的路径作为参数传递给ldd
命令。例如,如果which protoc
返回/usr/local/bin/protoc
,那么实际执行的命令将是ldd /usr/local/bin/protoc
。 -
ldd /usr/local/bin/protoc
:
这个命令用于显示给定可执行文件(在本例中为protoc
)的所有依赖库。它会列出所有共享库(.so 文件)及其路径,以及这些库加载到内存中的地址。这对于检查可执行文件链接到哪些库文件特别有用。
合并解释
所以,整个命令 ldd $(which protoc)
的作用是:
- 使用
which protoc
找到protoc
可执行文件的路径。 - 使用
ldd
列出protoc
可执行文件依赖的所有共享库及其路径。
protoc
编译器链接到了 Anaconda 环境下的 Protobuf 库
如果 protoc
编译器链接到了 Anaconda 环境下的 Protobuf 库,而不是你在 /usr/local/protobuf
下安装的版本,比如:
(base) chen@Ali-Ubuntu20:~/protobuf-learning/quick_start$ ldd $(which protoc)
linux-vdso.so.1 (0x00007ffc3c95a000) libprotoc.so.31 => /home/chen/anaconda3/bin/../lib/libprotoc.so.31 (0x00007fefd133e000) libstdc++.so.6 => /home/chen/anaconda3/bin/../lib/libstdc++.so.6 (0x00007fefd112a000) libgcc_s.so.1 => /home/chen/anaconda3/bin/../lib/libgcc_s.so.1 (0x00007fefd1110000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fefd0f17000) libprotobuf.so.31 => /home/chen/anaconda3/bin/../lib/./libprotobuf.so.31 (0x00007fefd0c65000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fefd0c40000) /lib64/ld-linux-x86-64.so.2 (0x00007fefd163a000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fefd0af1000) libz.so.1 => /home/chen/anaconda3/bin/../lib/././libz.so.1 (0x00007fefd0ad3000)
你需要确保你的 protoc
编译器和库文件来自相同的安装路径。以下是如何修复这个问题的步骤:
1. 修改 PATH 和 LD_LIBRARY_PATH 环境变量
你需要调整你的环境变量,使系统使用你在 /usr/local/protobuf
下安装的 Protobuf 编译器和库。
暂时修改环境变量
你可以在当前会话中暂时修改环境变量来验证配置:
export PATH=/usr/local/protobuf/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/protobuf/lib:$LD_LIBRARY_PATH
然后验证 protoc
版本和库文件路径:
protoc --version
ldd $(which protoc)
永久修改环境变量
如果以上步骤解决了问题,你可以将这些环境变量添加到你的 shell 配置文件(例如 ~/.bashrc
或 ~/.bash_profile
),以便每次登录时自动设置:
echo 'export PATH=/usr/local/protobuf/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/protobuf/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
2. 确认并重新生成 .pb 文件
确保你使用的是正确版本的 protoc
编译器来生成 .pb.h
和 .pb.cc
文件:
protoc --cpp_out=. contacts.proto
3. 编译项目
最后,使用新的设置重新编译你的项目:
g++ main.cc contacts.pb.cc -o TestProtoBuf -std=c++11 -lprotobuf