编译小结(4) 说说静态库(.a)
来源:互联网 发布:mssql数据库日志截断 编辑:程序博客网 时间:2024/05/16 17:42
静态库的概念和特点就不说了,这里只展示下编译过程和调用时会出现的问题。
程序代码附在 编译小结(3) 动态库(.so)编译及二种调用技巧 一章的后面。
一步一步看我的演示过程:
综上。 静态库编译时,参数顺序很重要。我上面只是调整了下顺序编译就通不过了。
而动态库没这种问题。
另要注意在默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。
附录:
静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
/*例子目录结构:[root@ol64 test4]# ls *main.clib:add.c calc.h sub.c操作系统: Oracle Linux 6.4编译版本:[root@ol64 test4]# gcc --versiongcc (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.aadd.osub.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]# ./demoadd() = 8 sub() = 2MAIL:xcl_168@aliyun.com 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]# ./demo2add() = 8 sub() = 2MAIL:xcl_168@aliyun.com 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: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168
- 编译小结(4) 说说静态库(.a)
- 编译.a静态库
- Xcode .a静态库编译
- 说说编译时断言(静态断言)
- 编译小结(7)Automake编译静态库与动态库
- 用gcc编译生成静态库*.a
- (linux)eclipse编译静态库 .a
- log4cplus编译出静态库liblog4cplus.a
- android编译openssl静态库.a
- ios编译静态库.a文件
- android NDK编译.a静态库
- log4cplus编译出静态库liblog4cplus.a
- [XCODE 编译静态库] xcode 4 制作静态库详解 .a文件
- 编译静态库.a文件步骤和引用静态库
- 如何编译静态库及将多个.a静态库合并成一个.a静态库
- 第三方静态库编译:ZBar编译libZbar.a
- 说说编译
- Qt 4.8.5 静态编译小结
- 破解Oracle ERP密码
- 编译directshow若干问题的解决
- paip.语义相关是否可在 哈米 的语义分析中应用
- 数据的游戏:冰与火
- myeclipse中项目名称改掉,造成cvs版本混乱问题解决(有很多代码未提交)
- 编译小结(4) 说说静态库(.a)
- 线程同步
- mahout学习(1)userCF+itemCF
- How to protect your CDN origin server
- 证书
- 编译小结(5) Makefile项目实用例子
- 成为优秀程序员的方法就是抛开编程?
- Swing简单边框(Border)设置
- field:global.autoindex 自动增长