Linux中.a,.la,.o,.so文件的意義和編程實現
Posted on 2009-05-04 14:41 Prayer 閱讀(587) 評論(0) 編輯 收藏 引用 所屬分類: C/C++ 、LINUX/UNIX/AIXLinux中.a,.la,.o,.so文件的意義和編程實現
linux下文件的類型是不依賴于其后綴名的,但一般來講:
.o,是目標文件,相當于windows中的.obj文件
.so 為共享庫,是shared object,用于動態連接的,和dll差不多
.a為靜態庫,是好多個.o合在一起,用于靜態連接
.la為libtool自動生成的一些共享庫,vi編輯查看,主要記錄了一些配置信息。可以用如下命令查看*.la文件的格式
所以可以用vi來查看其內容。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
創建.a庫文件和.o庫文件:
[yufei@localhost perl_c2]$ pwd
/home/yufei/perl_c2
[yufei@localhost perl_c2]$ cat mylib.c
#include <stdio.h>
#include <string.h>
void hello(){
}
[yufei@localhost perl_c2]$ cat mylib.h
extern void hello();
[yufei@localhost perl_c2]$ gcc -c mylib.c
[yufei@localhost perl_c2]$ dir
mylib.c
[yufei@localhost perl_c2]$ ar -r mylib.a mylib.o
ar: 正在創建 mylib.a
[yufei@localhost perl_c2]$ dir
mylib.a
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
111111111111111111111111
動態鏈接庫*.so的編譯與使用- -
動態庫*.so在linux下用c和c++編程時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和鏈接,總算搞懂了這個之前一直不太了解得東東,這里做個筆記,也為其它正為動態庫鏈接庫而苦惱的兄弟們提供一點幫助。
1、動態庫的編譯
下面通過一個例子來介紹如何生成一個動態庫。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。
so_test.h:
#include <stdio.h>
#include <stdlib.h>
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
}
test_b.c:
#include "so_test.h"
void test_b()
{
}
test_c.c:
#include "so_test.h"
void test_c()
{
}
將這幾個文件編譯成一個動態庫:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、動態庫的鏈接
在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這個庫里的函數。程序的源文件為:test.c。
test.c:
#include "so_test.h"
int main()
{
}
l
$ gcc test.c -L. -ltest -o test
l
$ ldd test
l
3、編譯參數解析
最主要的是GCC命令行的一個選項:
l
l
l
l
l
4、注意
makefile里面怎么正確的編譯和連接生成.so庫文件,然后又是在其他程序的makefile里面如何編譯和連接才能調用這個庫文件的函數????
答:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注釋^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LD_LIBRARY_PATH可以在/etc/profile還是 ~/.profile還是 ./bash_profile里設置,或者.bashrc里,
改完后運行source /etc/profile或 . /etc/profile
更好的辦法是添入/etc/ld.so.conf, 然后執行 /sbin/ldconfig
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注釋^^^^^^^^^^^^^^^^^^^^^^^^^^^^
是把庫路徑添加到/etc/ld.so.conf,然后以root身份運行ldconfig
CFLAGS=-Wall -ggdb -fPIC
#CFLAGS=
all: libfunc test
libfunc:func.o func1.o
***********************************************注釋************************************************
ln -s是用來創建軟鏈接,也就相當于windows中的快捷方式,在當前目錄中創建上一級目錄中的文件ttt的命名為ttt2軟鏈接的命令是ln -s ../ttt ttt2,如果原文件也就是ttt文件刪除的話,ttt2也變成了空文件。
ln -d是用來創建硬鏈接,也就相當于windows中文件的副本,當原文件刪除的時候,并不影響“副本”的內容。
編譯目標文件時使用gcc的-fPIC選項,產生與位置無關的代碼并能被加載到任何地址:
gcc –fPIC –g –c liberr.c –o liberr.o
使用gcc的-shared和-soname選項;
使用gcc的-Wl選項把參數傳遞給連接器ld;
使用gcc的-l選項顯示的連接C庫,以保證可以得到所需的啟動(startup)代碼,從而避免程序在使用不同的,可能不兼容版本的C庫的系統上不能啟動執行。
gcc –g –shared –Wl,-soname,liberr.so –o liberr.so.1.0.0 liberr.o –lc
建立相應的符號連接:
ln –s liberr.so.1.0.0 liberr.so.1;
ln –s liberr.so.1.0.0 liberr.so;
在MAKEFILE中:
$@
$%
$<
$?
$^
*********************************************注釋***********************************************************************
test: test.o libfunc
%.o:%.c
clean:
要生成.so文件,cc要帶-shared 參數;要調用.so的文件,比如libfunc.so,可以在cc命令最后加上-lfunc,還要視情況加上-L/usr/xxx 指出libfunc.so的路徑;這樣,在你要編譯的源文件中就可以調用libfunc.so這個庫文件的函數.