gcc生成动态库
編譯動態庫和靜態庫的一些方法
以gcc為例:
1,build static library:
??? #gcc -c *.c
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
??? #ar cq libtest.a *.o
ar create, modify, and extract from archives
(1)命令:
d??????? - 從歸檔文件中刪除文件
m[ab]??????? - 在歸檔文件中移動文件
p??????? - 打印在歸檔文件中找到的文件
q[f]??????? - 將文件快速追加到歸檔文件中
r[ab][f][u]??? - 替換歸檔文件中已有的文件或加入新文件
t??????? - 顯示歸檔文件的內容
x[o]??????? - 從歸檔文件中分解文件
(2)特定命令修飾符:
[a]??????? - 將文件置于 [成員名] 之后
[b]??????? - 將文件置于 [成員名] 之前 (于 [i] 相同)
[N]??????? - use instance [count] of name
[f]??????? - truncate inserted file names
[P]??????? - 在匹配時使用完整的路徑名
[o]??????? - 保留原來的日期
[u]??????? - 只替換比當前歸檔內容更新的文件
(3)通用修飾符:
[c]??????? - 不在必須創建庫的時候給出警告
[s]??????? - 創建歸檔索引 (cf. ranlib)
[S]??????? - 不要創建符號表
[v]??????? - 輸出較多信息
[V]??????? - 顯示版本號
2,build dynamic library:
??? #gcc -shared -fPIC -DPIC -c *.c
gcc:
-shared??? 指定生成動態鏈接庫。
-static??????? 指定生成靜態鏈接庫。
-fPIC??????? 表示編譯為位置獨立的代碼,用于編譯共享庫。目標文件需要創建成位置無關碼,概念上就是在可執行程序裝載它們的時候,它們可以放在可執行程序的內存里的任何地方。
-L.??????? 表示要連接的庫在當前目錄中。
-l??????? 指定鏈接時需要的動態庫。編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱。
-Wall??????? 生成所有警告信息。
-ggdb??????? 此選項將盡可能的生成gdb的可以使用的調試信息。
-g??????? 編譯器在編譯的時候產生調試信息。
-c??????? 只激活預處理、編譯和匯編,也就是把程序做成目標文件(.o文件)。
-Wl,options??? 把參數(options)傳遞給鏈接器ld。如果options中間有逗號,就將options分成多個選項,然后傳遞給鏈接程序。
??? #ld -shared *.o -o libtest.so.1.0
or
??? #ld -shared -soname libtest.so.1 -o libtest.so.1.0 -lc libtest.o
ld:
-shared, -Bshareable??????? Create a shared library,表明輸出的文件被認為是共享的庫
通過 -soname name 選項,可以指定 soname 是什么。
-o FILE, --output FILE??????? Set output file name,指定了共享對象的 real name,指定 soname 和 real name 是很重要的,因為在安裝庫時要用到它們。
??? #ln -sf libtest.so.1.0 libtest.so
??? #gcc test.c -L. -ltest -o test
LD_LIBRARY_PATH??? 這個環境變量指示動態連接器可以裝載動態庫的路徑。
以gcc為例:
1,build static library:
??? #gcc -c *.c
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
??? #ar cq libtest.a *.o
ar create, modify, and extract from archives
(1)命令:
d??????? - 從歸檔文件中刪除文件
m[ab]??????? - 在歸檔文件中移動文件
p??????? - 打印在歸檔文件中找到的文件
q[f]??????? - 將文件快速追加到歸檔文件中
r[ab][f][u]??? - 替換歸檔文件中已有的文件或加入新文件
t??????? - 顯示歸檔文件的內容
x[o]??????? - 從歸檔文件中分解文件
(2)特定命令修飾符:
[a]??????? - 將文件置于 [成員名] 之后
[b]??????? - 將文件置于 [成員名] 之前 (于 [i] 相同)
[N]??????? - use instance [count] of name
[f]??????? - truncate inserted file names
[P]??????? - 在匹配時使用完整的路徑名
[o]??????? - 保留原來的日期
[u]??????? - 只替換比當前歸檔內容更新的文件
(3)通用修飾符:
[c]??????? - 不在必須創建庫的時候給出警告
[s]??????? - 創建歸檔索引 (cf. ranlib)
[S]??????? - 不要創建符號表
[v]??????? - 輸出較多信息
[V]??????? - 顯示版本號
2,build dynamic library:
??? #gcc -shared -fPIC -DPIC -c *.c
gcc:
-shared??? 指定生成動態鏈接庫。
-static??????? 指定生成靜態鏈接庫。
-fPIC??????? 表示編譯為位置獨立的代碼,用于編譯共享庫。目標文件需要創建成位置無關碼,概念上就是在可執行程序裝載它們的時候,它們可以放在可執行程序的內存里的任何地方。
-L.??????? 表示要連接的庫在當前目錄中。
-l??????? 指定鏈接時需要的動態庫。編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱。
-Wall??????? 生成所有警告信息。
-ggdb??????? 此選項將盡可能的生成gdb的可以使用的調試信息。
-g??????? 編譯器在編譯的時候產生調試信息。
-c??????? 只激活預處理、編譯和匯編,也就是把程序做成目標文件(.o文件)。
-Wl,options??? 把參數(options)傳遞給鏈接器ld。如果options中間有逗號,就將options分成多個選項,然后傳遞給鏈接程序。
??? #ld -shared *.o -o libtest.so.1.0
or
??? #ld -shared -soname libtest.so.1 -o libtest.so.1.0 -lc libtest.o
ld:
-shared, -Bshareable??????? Create a shared library,表明輸出的文件被認為是共享的庫
通過 -soname name 選項,可以指定 soname 是什么。
-o FILE, --output FILE??????? Set output file name,指定了共享對象的 real name,指定 soname 和 real name 是很重要的,因為在安裝庫時要用到它們。
??? #ln -sf libtest.so.1.0 libtest.so
??? #gcc test.c -L. -ltest -o test
LD_LIBRARY_PATH??? 這個環境變量指示動態連接器可以裝載動態庫的路徑。
總結
- 上一篇: 盘点 《合金弹头》中出现的那些有意思的
- 下一篇: shell date常用运算命令