久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用scons替代makefile(2)

 心不留意外塵 2016-04-21
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文件

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多