Linux中安装google的libphonenumber c++库方法是什么
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"Linux中安装google的libphonenumber c++库方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些
千家信息网最后更新 2026年11月03日Linux中安装google的libphonenumber c++库方法是什么
本篇内容介绍了"Linux中安装google的libphonenumber c++库方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
libphonenumber 依赖的库
进入cpp中可以看到三大linux, mac, win系统的安装说明README, 这里只是记录在Centos6中安装的过程, 如果你选择的是google推荐的ubuntu系统, 照着做就好. 我使用的是Centos6x, 由于当前版本的libphonenumber库已经迁移到c++11了, 而Centos6默认安装的编译器GCC4.4.7并不支持全部的c++11特性, 事实上它只支持C++0x, 这就需要安装scl (一个在centos/redhat系列安装最新版本开发环境的工具, 这里不做介绍), 我使用的是Scl安装的GCC8编译, 以下列出我使用的依赖库及版本:1. Cmake: 使用系统源安装 2.8 *yum install cmake -y2. Google test: 1.8.1 (需要C++11) *wget https://github.com/google/googletest/archive/release-1.8.1.tar.gz *tar xf release-1.8.1.tar.gz *cd googletest-release-1.8.1 *mkdir build *cd build *cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX= .. *make && make install3. RE2: 使用系统源安装 *yum install re2-devel -y4. protobuffer: 2.6.1 *wget https://github.com/protocolbuffers/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.bz2 *tar xf protobuf-2.6.1.tar.bz2 *cd protobuf-2.6.1 *./configure && make && make install5. ICU: 我选择的是当前最新版本 64.2 *wget https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-src.tgz *tar xf icu4c-64_2-src.tgz *cd icu/source *./configure && make && make install6. Boost: 这个也是源安装 *yum install -y boost-devel boost-system boost-thread7. 注: 由于make install需要安装到系统, 所以需要你提供管理员权限, 貌似操作yum也需要, 如果使用的普通用户要注意这一点.完成以上步骤以后, libphonenumber的依赖库都安装完毕, 接下来让我们编译主角吧
下载编译 libphonenumber 源码
git clone https://github.com/google/libphonenumber.git cd libphonenumber/cpp mkdir build cd build cmake .. make ./libphonenumber_testtest都成功了那就是ok了, 接下来就是如何使用了
使用libphonenumber库
#include#include using namespace std;#include "phonenumbers/phonenumber.h"using i18n::phonenumbers::PhoneNumber;#include "phonenumbers/phonenumberutil.h"using i18n::phonenumbers::PhoneNumberUtil;// phone格式类似于: +86:18612345678void test_phone_number(const string& phone) { string region; string phone_num; auto idx = phone.find(":"); if (idx != string::npos) { region = phone.substr(0, idx); phone_num = phone.substr(idx + 1); } else { region = "+86"; phone_num = phone; } PhoneNumber pn; pn.set_country_code(std::stoul(region)); pn.set_national_number(std::stoull(phone_num)); PhoneNumberUtil *util = PhoneNumberUtil::GetInstance(); // region code == ISO Id std::string reg_code; util->GetRegionCodeForNumber(pn, ®_code); std::cout << "region code: " << reg_code << std::endl; // country code cout<< "country code: " << util->GetCountryCodeForRegion(reg_code) << endl; // phone number std::string name; util->GetNationalSignificantNumber(pn, &name); std::cout << "national number: " << name << std::endl; // validation std::cout<<"validation: " << std::boolalpha << util->IsValidNumber(pn) << std::endl; std::cout<<"possibale validation: " << std::boolalpha << util->IsPossibleNumber(pn) << std::endl; std::cout<<"possibale reason: " << util->IsPossibleNumberWithReason(pn) << std::endl; std::cout<<"validation for region: " << std::boolalpha << util->IsValidNumberForRegion(pn, reg_code) << std::endl;}int main(int argc, char** argv){ if (argc != 2) { cout << "error argc: " << argc << endl; display_help(argv[0]); return -1; } string phone = argv[1]; test_phone_number(phone); return 0;}// 编译时 指定 libphonenumber.so 所在目录. -L lib -lphonenumber// 执行前可以指定动态库路径[hello@world test-phonenumber]$ LD_LIBRARY_PATH=./lib ./test-phonenumber +86:18612345678执行结果如下:test stoul: 86region code: CNcountry code: 86national number: 18612345678validation: truepossibale validation: truepossibale reason: 0validation for region: true 注: 如果有问题可以联系我, 因为是截取的代码, 可能有疏漏.
简化部署的问题
[hello@world test-phonenumber]$ ldd test-phonenumber linux-vdso.so.1 => (0x00007fff3ad5f000) libphonenumber.so.8 => not found libdl.so.2 => /lib64/libdl.so.2 (0x00007fc1acad1000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fc1ac7cb000) libm.so.6 => /lib64/libm.so.6 (0x00007fc1ac547000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc1ac330000) libc.so.6 => /lib64/libc.so.6 (0x00007fc1abf9c000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc1abd7f000) /lib64/ld-linux-x86-64.so.2 (0x00007fc1acce2000)[hello@world test-phonenumber]$ ldd ./lib/libphonenumber.so.8.10 linux-vdso.so.1 => (0x00007ffedf7fb000) libprotobuf.so.9 => /usr/local/lib/libprotobuf.so.9 (0x00007fb7e8d8a000) libboost_date_time-mt.so.5 => /usr/lib64/libboost_date_time-mt.so.5 (0x00007fb7e8b6c000) libboost_system-mt.so.5 => /usr/lib64/libboost_system-mt.so.5 (0x00007fb7e8969000) libboost_thread-mt.so.5 => /usr/lib64/libboost_thread-mt.so.5 (0x00007fb7e8754000) libicuuc.so.64 => /usr/local/lib/libicuuc.so.64 (0x00007fb7e8384000) libicui18n.so.64 => /usr/local/lib/libicui18n.so.64 (0x00007fb7e7e9e000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fb7e7b98000) libm.so.6 => /lib64/libm.so.6 (0x00007fb7e7913000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb7e76fd000) libc.so.6 => /lib64/libc.so.6 (0x00007fb7e7369000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb7e714b000) libz.so.1 => /lib64/libz.so.1 (0x00007fb7e6f35000) librt.so.1 => /lib64/librt.so.1 (0x00007fb7e6d2d000) libicudata.so.64 => /usr/local/lib/libicudata.so.64 (0x00007fb7e50ea000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fb7e4ee6000) /lib64/ld-linux-x86-64.so.2 (0x00007fb7e93d0000) 使用ldd命令查看依赖库及位置, 依赖的库名: libicuuc.so.64 => 库在系统中的路径 /usr/local/lib/libicuuc.so.64 (0x00007fb7e8384000). 部署的时候只要把所有依赖的so都拷贝下来一起部署, 这样就不用在目标系统安装编译安装一堆库了, 我把libphonenumber依赖的so都列出来, 请按照实际情况 (我都copy到当前目录的lib目录下):[hello@world test-phonenumber]$ ls -1 lib libboost_date_time-mt.so libboost_date_time-mt.so.5 libboost_system-mt.so libboost_system-mt.so.5 libboost_thread-mt.so libboost_thread-mt.so.5 libicudata.so.64 libicudata.so.64.2 libicui18n.so.64 libicui18n.so.64.2 libicuuc.so.64 libicuuc.so.64.2 libphonenumber.so libphonenumber.so.8 libphonenumber.so.8.10 libprotobuf.so libprotobuf.so.9 libprotobuf.so.9.0.1 注: .so 和 .so.9 这种都是对应的.so.9.0.1的符号链接, 在使用之前指定动态库搜索路径 LD_LIBRARY_PATH=./lib.
"Linux中安装google的libphonenumber c++库方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
系统
编译
版本
中安
接下来
目录
路径
方法
c++
内容
动态
实际
就是
情况
更多
知识
过程
问题
支持
选择
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技有限公司
互联网科技海报
伟宏互联网科技
新华互联网科技
重生之互联网科技帝国
科技企业和互联网企业
上海互联网科技有限公司
玉溪互联网科技怎么选
互联网媒体平台算高科技产业
健康食品互联网创新科技园项目
天津腾达互联网科技有限公司
特约风豹互联网科技为什么扣费
滨湖区互联网智能科技产品有哪些
怎样加入科技互联网
中国互联网有什么科技
互联网安防科技感
广州燕处互联网科技有限公司
互联网科技平台产品运营
互联网科技收购价值
现代互联网科技公司
科技互联网产品
金融科技与互联网金融
人人互联网科技是培训
互联网金融科技公司干啥的
搜狐科技互联网
华夏恒生科技与互联网科技
本届互联网大会上的黑科技
银川新华互联网科技学校是国营吗
杭州融税互联网科技有限公司
重庆科技产业互联网有哪些