LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 755|回复: 5

请教一个静态库的问题

[复制链接]
发表于 2004-8-29 11:08:16 | 显示全部楼层 |阅读模式
写了一个程序
/*mylib.h*/
extern double mylog(double);

/*mylib.c*/
#include "mylib.h"
#include <math.h>
double mylog(double f)
{
  return log(f);
}

/*cal.c*/
#include <stdio.h>
#include "mylib.h"
int main(int argc,char** argv)
{
  double f = 10.2;
  printf("%f",mylog(f));
}
这样编译:
gcc -c mylib.c
gcc -c cal.c
ar cr libmy.a mylib.o
ar cr libcal.a cal.o
gcc -o cal libmy.a libcal.a
结果报错:
libcal.a(cal.o.b)(.text+0x34):cal.c: undefined reference to `mylog'
collect2: ld returned 1 exit status
但是最后一行这样写
gcc -o cal libcal.a libmy.a
又可以编译成功,
如果使用.o文件,则可以不计前后位置,如gcc -o cal cal.o mylib.o和gcc -o cal mylib.o cal.o
都可以。
想请教高手这是什么原因。
 楼主| 发表于 2004-8-29 15:23:29 | 显示全部楼层

怎么没人帮我解答一下啊?

很要紧的问题
发表于 2004-8-30 09:15:11 | 显示全部楼层
gcc -o cal  libcal.a libmy.a -lm

两个问题:(1)两个.a的顺序不对   (2)少了-lm
 楼主| 发表于 2004-8-30 15:26:33 | 显示全部楼层

好像不加-lm选项也可以啊

我试过了,可以不加-lm选项。
两个.a的顺序不对我是知道的,问题是为什么顺序的不同导致了编译结果一个能通过,一个不能通过。大侠能为小弟解释个中的原因吗?
发表于 2004-8-30 18:18:22 | 显示全部楼层
如果a库依赖于b库,则在连接的时候必须将b库放在后面!,你的源文件必须写在用到的所有的库的前面。
发表于 2004-8-30 18:22:23 | 显示全部楼层
当链接程序扫描libcal.a时发现一个未解决的符号mylog,它从正在扫描的文件开始按照命令行所指定的顺序搜索mylog的实现。

当libcal.a在前面,链接程序将在libmy.a中找到mylog的实现,当libcal.a在后面...于是乎...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表