下載並編譯libuv
libuv需要自己手動下載源碼,並手動編譯。
當前目錄為:/home/xlz/test/github/,在后面,會用$PATH來代替,我的系統的Debian8,64bit.
$git clone https://github.com/libuv/libuv.git
即可下載到libuv源碼
然后$cd libuv 進入到libuv源碼目錄下,准備編譯。
依次運行如下命令:
$ sh autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install
備注:
如果提示缺少一些庫,請自行安裝,apt-get install packagename
如,我運行autogen.sh的時候,就提示缺少automake,libtoolize庫:
xlz@debian:~/test/github/libuv$ sh autogen.sh
autogen.sh: 1: autogen.sh: automake: not found
autogen.sh: 33: test: Illegal number:
autogen.sh: 34: test: Illegal number:
- libtoolize --copy
autogen.sh: 43: autogen.sh: libtoolize: not found
運行如下命令,手動安裝,即可:
$ sudo apt-get install automake
$ sudo apt-get install libtool
編寫測試代碼:
在$PATH的libuv目錄下新建xlz_test.c
/*
* xlz_test.c
* empty msg loop
* 這個例子新建了一個消息隊列,但隊列里沒有任何消息,程序直接退出
* Created on 2016/9/10
*/
#include <stdio.h>
#include <stdlib.h>
#include "include/uv.h"
int main(char argc, char *argv[])
{
uv_loop_t *loop = uv_loop_new(); // 可以理解為新建一個消息隊列
uv_run(loop, UV_RUN_DEFAULT); // 啟動消息隊列,UV_RUN_DEFAULT模式下,當消息數為0時,就會退出消息循環。
printf("hello, world\n");
return 0;
}
編譯及鏈接:
在$PATH的libuv目錄下,命令行執行如下命令,如果當前文件夾下沒有build目錄,就請先創建一個build目錄
$gcc -c xlz_test.c -o xlz_build/xlz_test.o // 編譯,生成xlz_test.o文件
$gcc xlz_test.c -L/usr/local/lib/ -luv -o x_test // 鏈接生成可執行文件
//也可使用如下命令進行鏈接:
$gcc =o xlz_test xlz_test.o /usr/local/lib/libuv.so //生成目標文件要包含libuv.so庫,這里需要絕對路徑,因為我們用到了它里面的函數。
//$gcc -lpthread -o xlz_test xlz_build/xlz_test.o /usr/local/lib/libuv.a
上面第二條編譯,連接libuv.a庫的時候,我的是在這個目錄下,因為我的系統都是Debian 8, 64bit,
可能不同的系統位置是不同的,有的人可能在/usr/lib64/下或者其他目錄下,請自行定位。
注意:有的系統在鏈接為可執行文件后,執行程序時可能會報錯,或者無法連接為可執行程序:
libtest: error while loading shared libraries: libuv.so.1: cannot open shared object file: No such file or directory
網上搜一下,這里主要原因是:ld提示找不到庫文件,而庫文件就在/usr/local/lib目錄下。
鏈接器ld默認的目錄是/lib/和/usr/lib,如果放在其他路徑也可以,需要讓ld知道庫文件在哪里。
方案1:
編輯/etc/ld.so.conf文件,在新的一行中加入庫文件所在目錄;
然后執行
$ldconfig
以更新/etc/ld.so.cache文件;
方案2:
在/etc/ld.so.conf.d/目錄下新建任何以.conf為后綴的文件,如
$sudo vim libuv.conf
在libuv.conf文件中加入庫文件所得目錄作為內容;
運行,如下命令,以更新/etc/ld.so.cache文件;
$sudo ldconfig
我參考別人博客,也選擇方案2:
在/etc/ld.so.conf/目錄下新建libuv.conf文件,並在libuv.conf文件中,把目錄/usr/local/lib/加入其中。
該博主給出的理由,我很同意,如下:
本人覺得第二種辦法更為方便,對於原系統的改動最小。因為/etc/ld.so.conf文件的內容是include /etc/ld.so.conf.d/*.conf
所以,在/etc/ld.so.conf.d/目錄下加入的任何以.conf為后綴的文件都能被識別到。
ld.so.cache的更新是遞增式的,就像PATH系統環境變量一樣,不是從頭重新建立,而是向上累加。
除非重新開機,才是從零開始建立ld.so.cache文件。
關於ld.so.cache文件,暫時就不深入研究了,后續慢慢學習吧,先學libuv要緊。
執行程序
如果前面沒有錯誤的話,你會在$PATH下得到可執行程序文件test,在命令行下執行./xlz_test就可以得到如下結果了。
hello world
最后補張libuv的圖
參考:
http://blog.csdn.net/limite_god/article/details/43565253
http://blog.csdn.net/bingqingsuimeng/article/details/8237869
http://www.cnblogs.com/lisuyun/p/7080401.html