http://andylin02./blog/894910 本篇文章接著上一篇進一步介紹scons的使用方法,,主要介紹靜態(tài)庫和動態(tài)庫的編譯 在scons里編譯庫文件和編譯可執(zhí)行程序非常類似,,只是采用的指令有所不同。 對于靜態(tài)庫,,采用如下指令 Library(”libdemo”,["a.c","b.c"])或者StaticLibrary(”libdemo”,["a.c","b.c"]) 對于動態(tài)庫,,采用如下指令 SharedLibrary(”libdemo”,["a.c","b.c"]) 下面來看一個最簡單的例子吧,假如有兩個源文件a.c和b.c,,內(nèi)容分別如下 a.c中定義了函數(shù)demo_a [leconte@localhost demolib]$ cat a.c #include <stdio.h> void demo_a(char* s) { printf("%s\n",s); } b.c中定義了函數(shù)demo_b [leconte@localhost demolib]$ cat b.c #include <stdio.h> void demo_b() { printf("hello world\n"); } 在同一個目錄下編寫Sconstruct文件,,編譯靜態(tài)庫libdemo.a [leconte@localhost demolib]$ cat SConstruct Library("libdemo",["a.c","b.c"]) 然后進行編譯 [leconte@localhost demolib]$ scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o a.o -c a.c gcc -o b.o -c b.c ar rc libdemo.a a.o b.o ranlib libdemo.a scons: done building targets. 編譯過程中會生成各自的目標文件a.o和b.o,然后直接打包為靜態(tài)庫libdemo.a,。 接下來仍然用a.c和b.c來編譯動態(tài)庫libdemo.so 修改Sconstruct內(nèi)容為 [leconte@localhost demolib]$ cat SConstruct SharedLibrary("libdemo",["a.c","b.c"]) 執(zhí)行scons,,過程如下 [leconte@localhost demolib]$ scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o a.os -c -fPIC a.c gcc -o b.os -c -fPIC b.c gcc -o libdemo.so -shared a.os b.os scons: done building targets. 它會首先生成位置無關(guān)的目標文件a.os和b.os,然后再生成動態(tài)庫libdemo.so [leconte@localhost demolib]$ ldd libdemo.so linux-gate.so.1 => (0x0019a000) libc.so.6 => /lib/libc.so.6 (0x00e04000) /lib/ld-linux.so.2 (0x00252000) OK,下面的問題就是如何使用動態(tài)庫或者靜態(tài)庫了,,編寫一個簡單的程序main.c,,內(nèi)容如下 #include <stdio.h> void demo_a(char* s); void demo_b(); int main() { demo_b(); demo_a("www.linuxers.cn"); } 在之前的Sconstruct中加入一行,生成demo程序,,它依賴libdemo.a靜態(tài)庫 Library("libdemo",["a.c","b.c"]) Program("demo","main.c",LIBS=["demo"],LIBPATH=["."]); 在Sconstruct中需要用LIBS指令指定需要鏈接的庫,,用LIBPATH指定庫位置 編譯并執(zhí)行過程如下 [leconte@localhost demolib]$ scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o a.o -c a.c gcc -o b.o -c b.c gcc -o main.o -c main.c ar rc libdemo.a a.o b.o ranlib libdemo.a gcc -o demo main.o -L. -ldemo scons: done building targets. [leconte@localhost demolib]$ ./demo hello world www.linuxers.cn scons最基本的編譯庫和使用庫的方式就是這樣,很容易將這種方式擴展到你的項目中,。 當然,,實際項目中不可缺少的一點是多目錄編譯,這一點上scons類似于makefile,,都有包含機制,。 具體例子如下 [leconte@localhost demolib]$ cat SConstruct SConscript(['test1/SConscript', 'test2/SConscript', 'test3/SConscript', 'test4/SConscript']) 編譯過程中,會自動編譯 test1~test4目錄下的源文件,,當然具體的編譯過程依賴于各自目錄下的Sconstruct文件 |
|
來自: 心不留意外塵 > 《compile build》