| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3832 人关注过本帖
标题:gcc 相互依赖的多个静态库的连接方式是如何的?
取消只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:5 
gcc 相互依赖的多个静态库的连接方式是如何的?
[local]1[/local]
a.c
int a = 3;
extern int b;

b.c
int b = 3;
extern int a;

func.c
#include <stdio.h>
#include <stdlib.h>

extern int a,b;

int main(int argc, char *argv[])
{
   printf("a=%d, b=%d\n",a ,b);
   return 0;
}
如上定义好a.c ,b.c,func.c三个源码后,
zyd@HCC:~/projects> gcc a.c -c
zyd@HCC:~/projects> gcc b.c -c
zyd@HCC:~/projects> ar cr liba.a a.o
zyd@HCC:~/projects> ar cr libb.a b.o
使用以上命令分别得到两个库文件liba.a和libb.a
这样,库文件liba.a应该依赖于libb.a中定义的变量b;
            libb.a应该依赖于liba.a中定义的变量a;
但是为什么使用命令:
zyd@HCC:~/projects> gcc func.c -la -lb -L./ -g -o test
能顺利的得到目标文件test,而没有因为库文件的依赖关系要求-lb之后再连接一个-la呢?

搜索更多相关主题的帖子: return 
2011-03-09 01:12
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
[local]1[/local]
a.c
int a = 3;
extern int b;
extern int c;
b.c
int b = 4;
extern int a;
extern int c;
c.c
int c = 6;
extern int a;
extern int b;
func.c
程序代码:
#include <stdio.h>
#include <stdlib.h>

extern int a,b,c;

int main(int argc, char *argv[])
{
   printf("a=%d, b=%d\n",a ,b ,c);
   return 0;
}
使用以下命令得到3个库文件
zyd@HCC:~/projects> gcc -c  a.c b.c c.c
zyd@HCC:~/projects> ar cr liba.a a.o
zyd@HCC:~/projects> ar cr libb.a b.o
zyd@HCC:~/projects> ar cr libc.a c.o
最后使用gcc func.c -la -lb -lc -L./ -g -o test连接提示:
/usr/lib/crt1.o: In function `_start':
/usr/src/packages/BUILD/glibc-2.10.1/csu/../sysdeps/i386/elf/start.S:109: undefined reference to `__libc_csu_fini'
/usr/src/packages/BUILD/glibc-2.10.1/csu/../sysdeps/i386/elf/start.S:110: undefined reference to `__libc_csu_init'
/usr/src/packages/BUILD/glibc-2.10.1/csu/../sysdeps/i386/elf/start.S:119: undefined reference to `__libc_start_main'
/tmp/ccc8bPQo.o: In function `main':
/home/zyd/projects/func.c:8: undefined reference to `printf'
collect2: ld returned 1 exit status




~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-09 23:06
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
zyd@HCC:~/projects> ar cr libc1.a c.o

zyd@HCC:~/projects> gcc func.c -la -lb -lc1 -L./ -g -o test
做如上调整即可,说明在当前路径 -L./下找到了libc库之后就不继续查找库文件

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-09 23:09
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
c.c
int c = 6;
extern int a;
extern int b;
extern int d;
如此调整后,
zyd@HCC:~/projects> gcc -c  c.c
zyd@HCC:~/projects> ar cr libc1.a c.o
zyd@HCC:~/projects> gcc func.c -la -lb -lc1 -L./ -g -o test
但是c.c
程序代码:
int c = 6;
extern int a;
extern int b;
extern int d;

int foo()
{
   return d;
}
仍旧OK,说明对于以上.c代码
zyd@HCC:~/projects> gcc -c  c.c
zyd@HCC:~/projects> ar cr libc1.a c.o
zyd@HCC:~/projects> gcc func.c -la -lb -lc1 -L./ -g -o test
.//libc1.a(c.o): In function `foo':
c.c:(.text+0x4): undefined reference to `d'
collect2: ld returned 1 exit status
说明在没有使用时,gcc并不进行记录

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-09 23:13
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 5楼 pangding
恩,重名后优先找自己定义的libc.a文件

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-15 23:14
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
她:在干嘛
我:干什么,我很纠结
她:你一天到晚都在纠结,又在纠结什么
我:是嘛,象我这么多情的男人,在哪都是那么纠结 (c&f)
她:呸…你缺情差不多…   
我:下辈子我宁愿象你那么幸福就好了(赋格)
她:为什么,我哪幸福了?
我:哎,又对牛谈情了
她:快说啊
我:傻瓜是最幸福的(推)
我:就像你一样天天傻笑,很无邪
她:滚,去死。
我:我就喜欢看着你傻笑,想先看一下再去死。什么时候让我看看

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-07-13 00:25
快速回复:gcc 相互依赖的多个静态库的连接方式是如何的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017442 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved