您好,登錄后才能下訂單哦!
本篇內容介紹了“Linux中安裝google的libphonenumber c++庫方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
進入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 -y 2. 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 install 3. RE2: 使用系統源安裝 *yum install re2-devel -y 4. 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 install 5. 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 install 6. Boost: 這個也是源安裝 *yum install -y boost-devel boost-system boost-thread 7. 注: 由于make install需要安裝到系統, 所以需要你提供管理員權限, 貌似操作yum也需要, 如果使用的普通用戶要注意這一點. 完成以上步驟以后, libphonenumber的依賴庫都安裝完畢, 接下來讓我們編譯主角吧
git clone https://github.com/google/libphonenumber.git cd libphonenumber/cpp mkdir build cd build cmake .. make ./libphonenumber_test test都成功了那就是ok了, 接下來就是如何使用了
#include <iostream> #include <string> using namespace std; #include "phonenumbers/phonenumber.h" using i18n::phonenumbers::PhoneNumber; #include "phonenumbers/phonenumberutil.h" using i18n::phonenumbers::PhoneNumberUtil; // phone格式類似于: +86:18612345678 void 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: 86 region code: CN country code: 86 national number: 18612345678 validation: true possibale validation: true possibale reason: 0 validation 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++庫方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。