Linux中安装google的libphonenumber c++库方法是什么
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,本篇内容介绍了"Linux中安装google的libphonenumber c++库方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些
千家信息网最后更新 2024年11月28日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安全错误
数据库的锁怎样保障安全
开展工业网络安全工作总结
哪个软件开发实力好
软件开发自学好难
宁夏政务软件开发设计方案
网络安全从棱镜门
网络安全维护的职位
域名怎么用在服务器上
湘丰装备服务器
为进一步网络安全意识
软件开发转管理
cdma通讯网络技术有哪些
网络软件开发词语
免费虚拟主机服务器
数据库实体结构举例
ping服务器端口
软件开发文档由谁来写
博山供应链软件开发定制
广州链动互联网科技科技有限公司
灵璧软件开发技术
腾讯云服务器网站限制
互联网科技公司的创业
对数据库应用技术的认识
对网络安全问题重拳出击
淮南手机软件开发
软件开发的基本知识点
windows服务器并发
软件开发项目管理的制度
安康网络安全等保协会
高尔夫软件开发
乐高人仔数据库