2013年Erlang和C++雜七雜八日記

    寫這篇雜七雜八日記有如下幾個出發點:一、遇到問題是方便備查,提高效率;二、年末了,美好的一年又要過去了,總要留下點什麼美好的回憶吧;三、昨天同事在問我問題的時候,說了一句至關灰常很經典的話「每次問你問題,老是問一點擠一點:)」,同時是一個甜甜的微笑,他的微笑老是那麼滴迷人~~;四、其實在好久好久之前我就已經養成作雜記的習慣,只是沒有很系統地整理,有點亂。不過整理後仍是那麼有點亂,嘿嘿。html

    本「雜七雜八日記」記錄了本人13年和Erlang、C++鬥爭過程當中的一些經驗分享,C++是個千年老妖,Erlang這傢伙也不嫩,也有20幾歲了,都是很厲害的角色。本文將以「三板斧」的形式展開:安裝配置、經驗分享、參考資料。linux

    好了,廢話說完,開始正題,按國際慣例,先來一條git

 

華麗麗的分割線-------------------------------------------------------------------------------------------------------------------------------------github

 

Erlangweb

安裝配置:正則表達式

wget http://www.erlang.org/download/otp_src_R16B.tar.gz -P /usr/local/src

tar zxvf otp_src_R16B.tar.gz -C /usr/local/src
cd otp_src_R16B

./configure --prefix=/usr/local/erlang
注意,若是出現 crypto : No usable OpenSSL found, 須要安裝OpenSSL: yum install openssl-devel
make 
make install

安裝安裝路徑經過--prefix指定

安裝好測試
ln -s /usr/local/erlang/bin/erl /usr/local/bin/erl
ln -s /usr/local/erlang/bin/erlc /usr/local/bin/erlc (若是不執行之後有可能會報錯erlc: Command not found)
# erl
Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]shell

Eshell V5.10.1 (abort with ^G)
1> io:format("Hello World!\n").
Hello World!
ok
2>bash

 

Linux GUI下erlang沒法啓動toolbar的緣由
By admin | 2013 年 3 月 14 日 | Erlang, Linux 評論關閉
Erlang toolbar須要wxwidget,因此若是系統沒有安裝wxwidget將會致使toolbar沒法啓動:服務器

yum install wx*websocket

另外,有一些gui工具是使用tcl開發,建議在開發環境將tcl相關的工具所有安裝上:

yum install tcl*

 

安裝基於Eclipse的Erlang開發環境(Erlide)

安裝Eclipse

下載地址:http://www.eclipse.org/downloads/,選擇下載 Eclipse Classic 4.2, 182 MB

tar zxvf eclipse-SDK-4.2-linux-gtk.tar.gz
解壓以後進入目錄eclipse,直接打開eclipse可執行文件,便可使用。

安裝Erlide

官方的安裝文檔:http://erlide.org/#installation

簡單翻譯意思以下:

安裝Erlang R14B或更高版本,若是在Windows系統中,安裝路徑中不能有空格。
安裝Eclipse3.6或更高版本。
若是您的網絡使用一個代理服務器鏈接到互聯網,請填寫在相應的數據接口:Window → Preferences → General → Network connections
方法一:
打開Eclipse打開 Help → Install new software... ,在該對話框中輸入http://erlide.org/update 回車。 按照對話框的提示選擇須要安裝的目標後重啓Eclipse。
重啓Eclipse以後,打開Windows → Erlang → Installed runtimes,在右側點擊 Add → Borewse...,瀏覽到Erlang安裝目錄。例如我這裏選擇的是:/usr/local/erlang/lib/erlang

方法二:
從這裏直接下載安裝文件,而後直接扔到features和plugins目錄中,重啓eclipse
http://sourceforge.net/projects/erlide/files/update/

到這裏安裝就所有完成來。

 

ZeroMQ 安裝手冊:
http://yifangyou.blog.51cto.com/900206/617212

wget http://download.zeromq.org/zeromq-3.2.2.tar.gz
tar -zxvf zeromq-3.2.2.tar.gz
cd zeromq-3.2.2
./configure --prefix=/usr/local/zeromq
make & make install

 

-----------------------------------------------------------

erlzmq 安裝:(準確的說應該是編譯)靠譜的作法應該是利用EMakefile來編譯,執行shell命令: erl -make http://www.cnblogs.com/samis/articles/1841189.html
https://github.com/zeromq/erlzmq2

git clone https://github.com/zeromq/erlzmq2.git
cd erlzmq2
make

 

而後把ebin下的*.beam文件COPY到項目的ebin目錄
把priv目錄COPY到項目的priv


錯誤信息:
usr/bin/env: escript: No such file or directory

解決方案:
ln -s /usr/local/erlang/bin/escript /usr/sbin/escript

--------------------------------------------------------------

 

dump文件

erlang的dump文件能夠經過webtool:start()查看

 

erlzmq

錯誤信息:
The on_load function for module erlzmq_nif returned {error,
{bad_lib,
"Function not found erlzmq_nif:socket/4"}}


解決方案:
從新編譯erlzmq庫
cd Super_logger/src
make
把 ../ebin目錄下的erlzmq相關(erlzmq打頭的).beam文件COPY到目標項目的 ebin目錄

 

escript

錯誤信息:
usr/bin/env: escript: No such file or directory


解決方案:
ln -s /usr/local/erlang/bin/escript /usr/sbin/escript


http://blog.csdn.net/lijiecong/article/details/7107061

 

protobuf

庫:https://github.com/basho/erlang_protobuffs

編譯庫,注意不是用 erl -make ,是用自帶的make,它依賴於rebar

git clone https://github.com/basho/erlang_protobuffs.git
cd erlang_protobuffs
make

 

編譯.proto文件
cd ebin
erl
protobuffs_compile:scan_file("simple.proto").

把生成的 simple_pb.beam 拷貝到 ebin 目錄,simple_pb.hrl 拷貝到 include 目錄

 

RabbitMQ

http://www.rabbitmq.com/

Erlang安裝(RabbitMQ是用Erlang寫的)
詳見文檔:Erlang/Erlang安裝

xmlto (rabbitmq 編譯安裝時須要使用)

wget https://fedorahosted.org/releases/x/m/xmlto/xmlto-0.0.25.tar.gz --no-check-certificate
tar -zxf xmlto-0.0.25.tar.gz
cd xmlto-0.0.25
./configure --prefix=/usr/local/xmlto
make && make install

 

RabbitMQ安裝

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.3/rabbitmq-server-3.1.3.tar.gz
tar -zxf rabbitmq-server-3.1.3.tar.gz
cd rabbitmq-server-3.1.3
make
make TARGET_DIR=/usr/local/rabbitmq SBIN_DIR=/usr/local/rabbitmq/sbin MAN_DIR=/usr/local/rabbitmq/man install

 

注意在make install 時使用root權限
若是出現錯誤:xmlto: command not found,能夠嘗試從新安裝xmlto: yum -y install xmlto
若是出現錯誤:/bin/sh: escript: command not found,能夠嘗試: ln -s /usr/local/erlang/bin/escript /usr/sbin/escript


啓動RabbitMQ
cd /usr/local/rabbitmq/sbin
./rabbitmq-server start
或設置後臺運行 nohup ./rabbitmq-server start > nohup.out&
成功啓動後會有日下提示:
Activating RabbitMQ plugins ...
注意:RabbitMQ使用了5672端口

錯誤:
** Reason for termination ==
** {'module could not be loaded',
[{rabbit_net,send,[{file,"src/rabbitmq/amqp_network_connection.erl"},{line,169}]},
terminate: {{undef,
[{rabbit_net,send,

 

解決方案:

啓動erlang 的,須要指定rabbitmq的庫路徑

erl.exe -pz ./ebin -pa ./ebin -s amqp_client -pa ./ebin/rabbit_common -s toolbar -sasl errlog_type error
就是這一段: -pa ./ebin/rabbit_common

 

CPU負載高問題

CPU負載高是正常的,Erlang就是很是佔CPU的。Erlang自己在運行到多核就比較優秀,
以前我作過的項目,測試GameServer的時候,佔用CPU達到了2400%,幾乎把全部的核所有用完,響應仍是比較快。


有幾個參考能夠考慮一下:
+K true 啓用epoll
-P 134217727 設置erlang的最大線程數
-smp enable 啓用多核支持

http://www.erlang.org/doc/man/erl.html

 

erlang優點在於線程消息傳遞及網絡層處理,業務邏輯比較弱。

以前餘峯在一篇文章叫C1000K,也就是單機支持100萬鏈接,這個也值得參考。

 

在eclipse中修改保存文件後不會自動編譯:
在src目錄裏邊執行make all報警告:
make: Warning: File `../ebin/gameserver_app.beam' has modification time 5.2 s in the future
make: Nothing to be done for `all'.
make: warning: Clock skew detected. Your build may be incomplete.

緣由及解決:

在LINUX中編譯kernel時出現 make: warning: Clock skew detected. Your build may be incomplete.

緣由是我在更換主板BIOS包時將主板電池的電放了以後沒有進入BIOS裏面將時間更正過來,因此LINUX在編譯時會出現這種錯誤。

出現這種錯誤的緣由分析以下:來源:Linux社區 做者:tedsky(感謝萬能的百度)

在系統啓動時,Linux操做系統將時間從CMOS中讀到系統時間變量中,之後修改時間經過修改系統時間實現。爲了保持系統時間與CMOS時間的一致 性,Linux每隔一段時間會將系統時間寫入CMOS。因爲該同步是每隔一段時間(大約是11分鐘)進行的,在咱們執行date -s後,若是立刻重起機器,修改時間就有可能沒有被寫入CMOS,這就是問題的緣由。若是要確保修改生效能夠執行以下命令。

解決步驟:

# date //輸入命令查看時間

。。。。。。(顯示的時間略)

# date -s 08/17/2010 //要修改爲的目標時間,要注意順序是 月/日/年

。。。。。。(顯示的時間略)

# date -s 11:20:05 //要修改爲的目標時間, 要注意順序是 時:分:秒

。。。。。。(顯示的時間略)

# date //輸入命令查看時間

二 8月 17 11:20:05 CST 2010 //目標時間修改正確

# clock -w //這個命令強制把系統時間寫入CMOS

# date //輸入命令查看時間

二 8月 17 11:20:05 CST 2010 //目標時間修改正確

# make zImage //編譯成功

*^-^*…………

 

官網:http://www.erlang.org

 

Misultin - 輕量級HTTP(S)服務器Erlang開發包

https://github.com/ostinelli/misultin

http://www.open-open.com/lib/view/open1340586499264.html

http://erlang-china.org/misc/websocket-and-erlang.html

 

華麗麗的分割線-------------------------------------------------------------------------------------------------------------------------------------

 

C++

Eclipse C++插件

咱們須要一個cdt,這個能夠在Eclipse官網下載。

features
plugins
目錄下的全部文件分析COPY到Eclipse對應的目錄下。重啓搞定!

 

PCRE正則庫

PCRE是一個輕量級的函數庫,比Boost之中的正則表達式庫小得多。PCRE十分易用,同時功能也很強大,性能超過了POSIX正則表達式庫和一些經典的正則表達式庫。

和Boost正則表達式庫的比較顯示[2],雙方的性能相差無幾,PCRE在匹配簡單字符串時更快,Boost則在匹配較長字符串時勝出---但二者差距很小,考慮到PCRE的大小和易用性,咱們能夠認爲PCRE更值得考慮。

PCRE被普遍使用在許多開源軟件之中,最著名的莫過於Apache HTTP服務器和PHP腳本語言、R腳本語言,此外,正如從其名字所能看到的,PCRE也是perl語言的缺省正則庫。

http://www.cnblogs.com/wangshi/archive/2011/11/09/2243702.html

編譯command: g++ -o source source.cpp -I /usr/local/include/pcre/ -L /usr/local/lib/pcre/ -lpcrecpp

[1]pcre download and install. http://www.pcre.org/
[2]linux pcrecpp man page. http://linux.die.net/man/3/pcrecpp


安裝:

wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.zip
unzip pcre-8.34.zip
cd pcre-8.34
./configure --prefix=/usr/local/pcre
make
make install

 

ZeroMQ

錯誤:
error while loading shared libraries: libzmq.so.3: cannot open shared object file: No such file or directory

作一個軟連接:
sudo ln -s /usr/local/zeromq/lib/libzmq.so.3.0.0 /usr/lib/libzmq.so.3

若是還不能解決:執行 sudo /sbin/ldconfig 。由於ldconfig爲動態連接庫管理命令,通常在系統啓動時運行,當安裝了新的動態連接庫後,須要手動執行此命令

-------------------------------------------------------------------------
一、先安裝zeromq

wget http://download.zeromq.org/zeromq-3.2.2.tar.gz
tar zxvf zeromq-3.2.2.tar.gz && cd zeromq-3.2.2
./configure --prefix=/usr/local/zeromq
make && make install

作一個軟連接(看上面)

二、程序
https://github.com/imatix/zguide/blob/master/examples/C%2B%2B/hwclient.cpp
http://blog.chinaunix.net/uid-23629988-id-3015856.html
http://www.cppfans.org/1018.html
http://c.chinaitlab.com/basic/858621.html

三、編譯
/usr/bin/gcc hello.c -o hello -lzmq -L/usr/local/zeromq/lib -I/usr/local/zeromq/include

**********************************************************************************************

錯誤:zmq.hpp not found!

http://stackoverflow.com/questions/14233887/zmq-compilation-problems-for-c-examples

It looks zmq.hpp has been moved to another git repository beginning with ZMQ 3.2 which is available at https://github.com/zeromq/cppzmq. I have clonned this to same place where a previously extracted the ZMQ's tar ball. Then I created a symbolic link to zmq.hpp from the examples's C++ directory. Then examples compiled fine.

個人作法是把zmq.hpp Copy到/usr/local/zeromq/include目錄下。搞定。

zmq.hpp能夠從https://github.com/zeromq/cppzmq 下載

 

libconfig

http://www.hyperrealm.com/libconfig/

一、安裝

wget http://www.hyperrealm.com/libconfig/libconfig-1.4.9.tar.gz
tar -vxf libconfig-1.4.9.tar.gz
cd libconfig-1.4.9
./configure --prefix=/usr/local/libconfig
make
make install

sudo ln -s /usr/local/libconfig/lib/libconfig++.so.9.1.3 /usr/lib/libconfig++.so.9

 

刪除軟鏈接:rm -f /usr/lib/libconfig++.so.9

./Super_logger_client: error while loading shared libraries: libconfig++.so.9: cannot open shared object file: No such file or directory

若是還不能解決能夠嘗試: sudo ldconfig -v

二、編譯、連接時使用

C++程序中使用libconfig庫:
包含頭文件:#include <libconfig.h++>
指定使用命名空間:using namespace libconfig;
連接時指定:specify ‘-lconfig++’ as an argument to the linker.

/usr/bin/g++ sim_alg.cpp -o sim_alg -L/usr/local/libconfig/lib -I/usr/local/libconfig/include -lconfig++

三、可能遇到的錯誤:
terminate called after throwing an instance of 'libconfig::FileIOException'
what(): FileIOException

緣由是權限的問題。由於是用root帳號mount的,用普通用戶執行就會報此錯誤。
但奇怪的是在命令行直接執行exe文件卻又正常,詭異!!

解決方案:用.sh腳原本執行。下面腳本保存爲一個文件,如GameRobotNew.sh
#!/bin/sh
filepath=$(cd "$(dirname "$0")"; pwd)
#echo $filepath
cd $filepath
./Debug/GameRobotNew

 

log4cplus

官網: http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/

 

wget http://downloads.sourceforge.net/project/log4cplus/log4cplus-stable/1.1.2/log4cplus-1.1.2-rc2.zip
unzip log4cplus-1.1.2-rc2.zip
cd log4cplus-1.1.2-rc2
./configure --prefix=/usr/local/log4cplus
make
make install

 

安裝成功後將在/usr/local目錄或指定的目錄下建立include和lib兩個子目錄及相應文件。其中include目錄包含頭文件,lib目錄包含最終打包生成的靜態和動態庫。在動態鏈接log4cplus庫時請使用-llog4cplus選項。

 

文檔:
http://www.cnblogs.com/keepsimple/archive/2013/05/10/3071309.html
http://www.cppblog.com/API/archive/2011/04/02/143283.html


錯誤:
./GameRobotLib: error while loading shared libraries: liblog4cplus-1.1.so.7: cannot open shared object file: No such file or directory
作一個軟連接:
sudo ln -s /usr/local/log4cplus/lib/liblog4cplus-1.1.so.7 /usr/lib/liblog4cplus-1.1.so.7

若是還不能解決:執行 sudo /sbin/ldconfig 。由於ldconfig爲動態連接庫管理命令,通常在系統啓動時運行,當安裝了新的動態連接庫後,須要手動執行此命令

 

protobuf

http://code.google.com/p/protobuf/downloads/list

一、安裝

wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
tar -jxvf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0
./configure --prefix=/usr/local/protobuf
make
make install

 

錯誤:
error while loading shared libraries: libprotobuf.so.8: cannot open shared object file: No such file or directory

作一個軟連接:
sudo ln -s /usr/local/protobuf/lib/libprotobuf.so.8.0.0 /usr/lib/libprotobuf.so.8


編譯命令:
/usr/bin/g++ helloworldWrite.cpp helloworld.pb.cc -o helloworld -lprotobuf -I/usr/local/protobuf/include -L/usr/local/protobuf/lib
注意:要把生成的*.pb.cc文件鏈上。


編譯.proto文件:/usr/local/protobuf/bin/protoc --cpp_out=. helloworld.proto

相關文章
相關標籤/搜索