编译小结(4) 说说静态库(.a)

  静态库的概念和特点就不说了,这里只展示下编译过程和调用时会出现的问题。

/*
例子目录结构:
[root@ol64 test4]# ls *
main.c

lib:
add.c  calc.h  sub.c

操作系统: Oracle Linux 6.4
编译版本:
[root@ol64 test4]# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
*/

程序代码附在 编译小结(3) 动态库(.so)编译及二种调用技巧 一章的后面。

编译静态库:


直接用命令行搞定:
[root@ol64 lib]# gcc -c add.c
[root@ol64 lib]# gcc -c sub.c
[root@ol64 lib]# ls 
add.c  add.o  calc.h  sub.c  sub.o
[root@ol64 lib]# ar -rcs libcalc.a add.o sub.o
[root@ol64 lib]# ar -t libcalc.a
add.o
sub.o
[root@ol64 lib]# 

一步一步看我的演示过程:
//首先直接编译会说找不到静态库中的"sub" 和"ad"函数
[root@ol64 test4]# gcc -m64 -I./lib   -o demo main.c
/tmp/ccHsyaIp.o: In function `main':
main.c:(.text+0x14): undefined reference to `sub'
main.c:(.text+0x25): undefined reference to `add'
collect2: ld returned 1 exit status

//把静态库路径放到 静态库查找环境变量"LIBRARY_PATH"中去。
[root@ol64 test4]# export LIBRARY_PATH=`pwd`/lib

//很奇怪的,会仍报错。 虽然环境变量, "-L"参数我都设了
[root@ol64 test4]#   gcc -m64 -I./lib  -L./lib -lcalc -o demo main.c
/tmp/ccrnYQX7.o: In function `main':
main.c:(.text+0x14): undefined reference to `sub'
main.c:(.text+0x25): undefined reference to `add'
collect2: ld returned 1 exit status

//尝试调整一下顺序,可以了。
[root@ol64 test4]#  gcc -o demo main.c -m64 -I./lib  -L./lib -lcalc 
[root@ol64 test4]# ./demo
add() = 8 
sub() = 2
MAIL:[email protected] 
BLOG:http://blog.csdn.net/xcl168
[root@ol64 test4]# 



//尝试把 "-L"参数去掉。因为我已在环境变量"LIBRARY_PATH"中指定过了。
[root@ol64 test4]# gcc -o demo2 main.c -m64 -I./lib -lcalc
[root@ol64 test4]# ./demo2
add() = 8 
sub() = 2
MAIL:[email protected] 
BLOG:http://blog.csdn.net/xcl168
[root@ol64 test4]# echo $LIBRARY_PATH
/xcl/test4/lib

//再把顺序换一下,结果报错了。
[root@ol64 test4]# gcc -m64 -I./lib -lcalc  -o demo2 main.c
/tmp/ccshK94c.o: In function `main':
main.c:(.text+0x14): undefined reference to `sub'
main.c:(.text+0x25): undefined reference to `add'
collect2: ld returned 1 exit status

 综上。 静态库编译时,参数顺序很重要。我上面只是调整了下顺序编译就通不过了。
 而动态库没这种问题。

 另要注意在默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。

附录:

静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径


MAIL: [email protected]
BLOG:http://blog.csdn.net/xcl168


你可能感兴趣的:(gcc,静态库,静态库编译,编译.a,编译技巧)