溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux中安裝google的libphonenumber c++庫方法是什么

發(fā)布時(shí)間:2021-11-16 09:46:21 來源:億速云 閱讀:226 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Linux中安裝google的libphonenumber c++庫方法是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

libphonenumber 依賴的庫

進(jìn)入cpp中可以看到三大linux, mac, win系統(tǒng)的安裝說明README, 這里只是記錄在Centos6中安裝的過程, 如果你選擇的是google推薦的ubuntu系統(tǒng), 照著做就好. 我使用的是Centos6x, 由于當(dāng)前版本的libphonenumber庫已經(jīng)遷移到c++11了, 而Centos6默認(rèn)安裝的編譯器GCC4.4.7并不支持全部的c++11特性, 事實(shí)上它只支持C++0x, 這就需要安裝scl (一個(gè)在centos/redhat系列安裝最新版本開發(fā)環(huán)境的工具, 這里不做介紹), 我使用的是Scl安裝的GCC8編譯, 以下列出我使用的依賴庫及版本:
1. Cmake: 使用系統(tǒng)源安裝 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: 使用系統(tǒng)源安裝
    *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: 我選擇的是當(dāng)前最新版本 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: 這個(gè)也是源安裝
    *yum install -y boost-devel boost-system boost-thread
7. 注: 由于make install需要安裝到系統(tǒng), 所以需要你提供管理員權(quán)限, 貌似操作yum也需要, 如果使用的普通用戶要注意這一點(diǎn).
完成以上步驟以后, libphonenumber的依賴庫都安裝完畢, 接下來讓我們編譯主角吧

下載編譯 libphonenumber 源碼

    git clone https://github.com/google/libphonenumber.git
    cd libphonenumber/cpp
    mkdir build
    cd build
    cmake ..
    make
    ./libphonenumber_test
test都成功了那就是ok了, 接下來就是如何使用了

使用libphonenumber庫

#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, &reg_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;
}


// 編譯時(shí) 指定 libphonenumber.so 所在目錄. -L lib -lphonenumber
// 執(zhí)行前可以指定動態(tài)庫路徑
[hello@world test-phonenumber]$ LD_LIBRARY_PATH=./lib ./test-phonenumber +86:18612345678
執(zhí)行結(jié)果如下:
test stoul: 86
region code: CN
country code: 86
national number: 18612345678
validation: true
possibale validation: true
possibale reason: 0
validation for region: true

  注: 如果有問題可以聯(lián)系我, 因?yàn)槭墙厝〉拇a, 可能有疏漏.

簡化部署的問題

[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 => 庫在系統(tǒng)中的路徑 /usr/local/lib/libicuuc.so.64 (0x00007fb7e8384000).
  部署的時(shí)候只要把所有依賴的so都拷貝下來一起部署, 這樣就不用在目標(biāo)系統(tǒng)安裝編譯安裝一堆庫了, 我把libphonenumber依賴的so都列出來, 請按照實(shí)際情況 (我都copy到當(dāng)前目錄的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 這種都是對應(yīng)的.so.9.0.1的符號鏈接, 在使用之前指定動態(tài)庫搜索路徑 LD_LIBRARY_PATH=./lib.

“Linux中安裝google的libphonenumber c++庫方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI