轉載請注明表作者think8848及出處(http://think8848.cnblogs.com)
node-mapnik依賴項中要求g++ >= 5, toolchain (>= GLIBCXX_3.4.20 from libstdc++)(見官網說明),但是CentOS7里面默認的gcc和g++的版本是4.8.5,GLIBCXX只到3.4.19,因此部署過程中各種問題,經過常期、大量的折騰,最終終於找到一個可行的部署方法,在本文中將用到一些需要自行編譯安裝的包,只能保證文中的版本沒有問題,不保證其他版本可用。
gcc5.4.0源碼包 鏈接:http://pan.baidu.com/s/1sljcdrR 密碼:u48m
boost1.62.0源碼包 鏈接:http://pan.baidu.com/s/1sl6cEeh 密碼:mz0h
mapnik3.0.12完整源碼包(不需要從github上再下載依賴包) 鏈接:http://pan.baidu.com/s/1o79qvjk 密碼:aw4g
1. 最小安裝的CentOS安裝必要的工具包
建議本文中的所有操作使用root帳號,因為在make install使用sudo權限時,如果root帳號下沒有及時更新環境變量,就會發生很多意外;本文介紹的部署過程是一個非常漫長的過程,完整走一遍只少要半天(虛擬機:4G內存),為了避免不必要的麻煩,建議直接用root。
su
yum install wget vim net-tools unzip bzip2 gcc gcc-c++ epel-release libicu-devel -y
查看gcc和g++的版本,顯示為4.8.5
2. 升級gcc版本
CentOS下升級gcc版本有兩個途徑,一個是添加其他源進行自動升級,一個是手動編譯升級,這里先順便講下自動升級的兩個辦法:
a. 添加Fedora源
在 /etc/yum.repos.d 目錄中添加文件 FedoraRepo.repo ,並輸入以下內容:
[warning:fedora] name=fedora mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-23&arch=$basearch enabled=1 gpgcheck=1 gpgkey=https://getfedora.org/static/34EC9CBA.txt
然后使用 yum install gcc gcc-c++ -y 進行安裝,注意,如果你要用這種方法安裝gcc,那在第1步就干脆不要安裝gcc和gcc-c++包了。
b. 使用Devtoolset-4升級,詳細方法見這里
yum install centos-release-scl yum install devtoolset-4-gcc* scl enable devtoolset-4 bash which gcc gcc --version
好了,以上方法我們都不選,因為我最終部署成功用的是手動升級的方法(至於為什么不選擇自動更新,還有一個很重要的原因,那就是CentOS存在的邏輯,很多人選用CentOS而不是Ubuntu作為服務器操作系統,主要原因是什么呢?)
好了,我們先下載gcc5.4.0,下載地址 http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz
cd /usr/local/src wget -O gcc-5.4.0.tar.gz http://101.96.10.61/ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz tar -xzvf gcc-5.4.0.tar.gz cd gcc-5.4.0
#下載依賴項 ./contrib/download_prerequisites
#為了在長期的編譯過程中Linux不黑屏,臨時關閉屏保
setterm -blank 0
mkdir build && cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
#4核cpu就是j4,在vmware12下有用
make -j4
#機器不好大概這里要花3小時
make install
先查看下GLIBCXX的版本信息,不出意外的話,應該最高就到GLIBCXX_3.4.19,我們要用最新的版本替換原來的版本
搜索libstdc++.so.6*,看看都有什么結果,我們會發現在/usr/lib64里面有6.0.19,這是我們使用yum安裝的,/usr/local/lib64/libstdc++.so.6.0.21是我們剛才編譯安裝的,需要用最新的替換舊版本的。
首先將/usr/lib64下面的libstdc++.so.6*刪除掉
rm /usr/lib64/libstdc++.so.6* -f (實際刪除兩個文件),
然后我們在/usr/lib64下為libstdc++.so.6.0.21建立鏈接
ln -s /usr/local/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6 ,
順便再將/usr/local/lib64下面一個看着礙眼的文件刪除
rm /usr/local/lib64/libstdc++.so.6.0.21-gdb.py -f ,
(如果不刪除這個文件,則在ldconfig創建動態鏈接庫文件緩存時會報一個莫名其妙的錯誤)
最后在/etc/ld.so.conf中加入/usr/local/lib64,為動態共享庫指定搜索路徑 vim /etc/ld.so.conf
然后創建緩存
ldconfig
再次檢查GLIBCXX版本 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | more ,這時就已經包含GLIBCXX_3.4.21了
檢查下gcc和g++的版本,注意,如果檢查到的版本不是5.4.0,而是4.8.5(安裝前的版本),則仔細想想有沒有按照本文步驟來,如果確認是沒有出入,那么就重啟機器吧 reboot ,啟動好后再次檢查,應該就可以看到正確結果了。
3. 編譯安裝boost1.62.0
cd /usr/local/src wget -O boost_1_62_0.tar.gz http://pilotfiber.dl.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.gz tar -xzvf boost_1_62_0.tar.gz cd boost_1_62_0 ./bootstrap.sh --with-icu --with-libraries=all ./b2 threading=multi
#等吧,雖然沒有gcc編譯時間長,但是也不快 ./b2 install
經過一番磨人的編譯,boost的編輯結果出來了,貌似有些錯誤,但是不用理會
再次打開/etc/ld.so.conf添加共享庫路徑,在里面添加 /etc/local/lib
vim /etc/ld.so.conf
最后不要忘記更新緩存
ldconfig
5. 編譯安裝mapnik
先安裝依賴項,依賴項比較多,要仔細輸入,避免后面不必要的麻煩
yum install freetype-devel libtool-ltdl-devel libpng-devel libtiff-devel libjpeg-devel python-devel harfbuzz-devel postgresql-devel proj-devel proj-epsg sqlite-devel libwebp-devel gdal-devel cairo-devel -y
第一步先下載源碼,(直接下載的zip包里面缺少依賴項)
yum install git -y git clone git://github.com/mapnik/mapnik.git cd mapnik git submodule update --init
編譯安裝源碼,時間也有點小長,但是還能忍受,4核CPU用JOBS=4,具體視電腦情況而定
python scons/scons.py configure | more
python scons/scons.py JOBS=4
python scons/scons.py install
到這一步了就小心點,確保每個依賴項都已經存在
查看mapnik版本 mapnik-config -v
安裝完成后測試下mapnik是否能正常工作
ldconfig
cd /usr/local/src/mapnik/demo/c++
mkdir demo && cp ../data ./demo -r
vim rundemo.cpp
在rundemo.cpp中修改以下內容
修改前:
修改后:
然后編譯運行
make clean
make
./rundemo
有圖有真相,看看生成的地圖是啥樣的
6.安裝node.js
這一步是本文中最簡單的了,沒有任何技巧,如果安裝出問題 ,那一定是沒有按照我前面的步驟來
yum install nodejs -y
7. 安裝node-mapnik
cd /usr/local/src mkdir node-mapnik && cd node-mapnik vim package.json
在打開創建package.json文件后,輸入以下內容
{ "name": "nmtest", "description": "node-mapnik test by think8848", "version": "0.0.1", "private": true, "dependencies": { "mapnik": "3.*" } }
開始安裝node-mapnik,通常而言,使用 npm install 即可安裝好所有依賴包,然后因為眾所周知的原因...,如果你沒有沒有給力的翻牆工具,還是使用下列命令吧
npm install --registry=https://registry.npm.taobao.org
如果看到下面這個畫面,就說明成功了99%了
寫一段代碼測試下先將剛才我們在安裝mapnik時生成的demo.jpg復制過來
cp /usr/local/src/mapnik/demo/c++/demo.jpg ./
創建node代碼, vim app.js ,輸入以下內容
var mapnik = require('mapnik'); new mapnik.Image.open('demo.jpg').save('demo.png');
執行結果:
---------------------2016年12月18日更新----------------------------
將node-mapnik添加到公共模塊中
先將node-mapnik安裝到公共模塊的目錄,默認情況下安裝到 /usr/lib/node_modules
sudo npm install -g mapnik
添加 NODE_PATH 環境變量,使用 sudo vim /etc/profile 命令,然后在文件最下面添加
export NODE_PATH=/usr/lib/node_modules:$PATH
最后再更新環境變量
source /etc/profile
這樣以后就不用每次使用時都要安裝一次node-mapnik了,安裝的過程實在是太痛苦了,沒有梯子基本上不會成功。
---------------------2016年12月18日更新結束----------------------------
接下來將學習如何使用node-mapnik生成openstreetmap瓦片圖