2012年10月5日 星期五

Shared Library & Static Library

Shared Library - 動態連結程式庫:

在程式開始執行時才載入。

        1. 可減少執行檔的大小。
        2. 更新程式庫而無需重新編譯其他程式。
        3. 可在程式執行時更改程式庫。

每個library名稱大致上為 libxxx.so, 有時會加上版本如: libxxx.so.2.1

建立Shared Library:

    首先要以-fPIC選項建立一object file,PIC(position-independent code),
    是shared library必需使用的選項,這令shared library擁有自己的動態記憶體區塊
    i.e. 它使用全域記憶體偏移量表(global offset table,GOT),
    不受主程式的記憶體限制:

    gcc -fPIC -c -Wall initapi.c
    gcc -fPIC -c -Wall randapi.c

    然後再將目的檔編譯成「.so」:
    gcc -shared initapi.o randapi.o –o libmyrand2.so
Static Library - 靜態函式庫

在程式編譯時,若使用static library的話,則library中的元件會連結到我們的執行檔中,此時執行檔的大小會比較大,但優點就是 當我們在執行程式時,就不需要再loading library。

每個library名稱大致上為 libxxx.a

製作Static Library:

步驟一
gcc -c -Wall initapi.c
gcc -c -Wall randapi.c

步驟二
執行ar指令,將目的檔加入靜態函式庫中
ar –cru libmyrand.a initapi.o randapi.o
在執行上述指令後,會將initapi.o及randapi.o加入至libmyrand.a靜態函式庫中。
其中我們在ar指令中加入「-cru」的選項,這是建立或加入目的檔的標準作法,
   選項c指定要建立靜態函式庫,
   選項r告知ar取代其中已存在的目的檔,
   選項u則為一個安全選項,它告知ar欲取代的目的檔必須比已存在的目的檔還新才行。
p.s. 用「ldd 執行檔」指令可看執行檔在執行時所需要的shared library.

所以每當發生 /usr/bin/ld: cannot find -lxxx時,就是找不到此libxxx.so

安裝此lib就可解決,除非另一種狀況是用 whereis libxxx.so 指令可找到檔案,卻不在/usr/lib裡,可用 sudo /sbin/ldconfig/ ldconfig的用途是:

在(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,找出可共享的動態程式庫(格式為:lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表. 

ldconfig通常在系統啟動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令. 
reference:
http://www.lslnet.com/linux/f/docs1/i19/big5190821.htm

http://blog.xuite.net/ian11832/blogg/33493241-Linux%E5%8B%95%E6%85%8B%26%E9%9D%9C%E6%85%8B%E5%87%BD%E5%BC%8F%E5%BA%AB%E8%A7%A3%E8%AA%AA

2012年9月26日 星期三

Turn around time and cpu time

cpu time:程式使用CPU的時間(不含別的行程佔用掉的時間)

turn around time:程式執行經過的時間(不管是不是別的行程用掉的。統統算進來)

在c++ 用clock_t 去計算cpu time,用 time去計算turn around time

ex: time_t t1, t2;

clock_t start, finish;

double duration;

start = clock();

time(&t1);

//------------------------
// your program here.
//------------------------

time(&t2);

finish = clock();

duration = (double)(finish - start)/CLOCKS_PER_SEC;

printf("\n%f\n", duration);

printf("\n%f\n", difftime(t2, t1));

如果用thread下去跑,則用clock_t 計算出來的時間可能會比不用thread還長,

因為cpu把不同thread的cpu time都算進去。

OpenMP in XCODE 4.5

1. Project -> Build Settings -> GCC_version, choose LLVM GCC 4.2

2. Project -> Build Settings -> LLVM GCC 4.2 - Language -> ENABLE_OPENMP_SUPPORT, choose YES

 #include "omp.h" 

if xcode can not find omp.h, do this

3. Project -> Build Settings -> Search Paths -> HEADER_SEARCH_PATHS, choose /usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include

2012年7月10日 星期二

Java compile code with chinese comment

javac -encoding utf-8 xxx.java

如果用vim,也可以在c-mode下直接下command

:!javac -encoding utf-8 xxx.java
:java xxx


這樣可以省去儲檔離開的動作。
也可用% 取代冗長的檔名 :!javac %