使用g++編譯、運行libuv的demo錯誤解決
我們通過例子來講述監視器的使用. 例子中空轉監視器回調函數被不斷地重復調用, 通過例子我們也可以了解到:
由於設置了監視器, 所以調用 uv_run() 是程序會阻塞, 空轉監視器將會在計數器達到設定的值時停止(監視), uv_run() 會退出因為此時程序中沒有活動的監視器了.
測試代碼如下

1 #include <stdio.h> 2 #include <uv.h> 3 4 int64_t counter = 0; 5 6 static void wait_for_a_while(uv_idle_t* handle) { 7 counter++; 8 9 if (counter >= 10e6) 10 uv_idle_stop(handle); 11 } 12 13 int main() { 14 uv_idle_t idler; 15 uv_idle_init(uv_default_loop(), &idler); 16 uv_idle_start(&idler, wait_for_a_while); 17 18 printf("Idling...\n"); 19 uv_run(uv_default_loop(), UV_RUN_DEFAULT); 20 21 return 0; 22 }
g++ -c libuv_test.c //生成libuv_test.o文件
g++ -o libuvtest libuv_test.o /usr/local/bin/libuv.so 生成目標文件要包含libuv.so庫,這里需要全路徑,因為我們用到了它里面的函數。
chmod 755 libtest //賦予執行權限
./libtest
報錯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為后綴的文件,在該文件中加入庫文件所在的目錄;
運行ldconfig,以更新/etc/ld.so.cache文件;
我的解決辦法是:在./etc/ld.so.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文件。