LinuxSir.cn,穿越时空的Linuxsir!

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

问个低级问题:连接时为什么单独的.o文件可以,.a文件却出错

[复制链接]
发表于 2005-11-4 12:04:12 | 显示全部楼层 |阅读模式
g++ -o g4 Gui/MenuItem.o Gui/MainMenu.o Gui/Manager.o -lXext -lX11 -lm -ldl -lGLU -lGL -lpthread
不会出错,可是我把*.o打包成Gui.a时却出错了:
g++ -o g4 Gui/Gui.a -lXext -lX11 -lm -ldl -lGLU -lGL -lpthread

Gui.a里的函数都找不到了。

还没搞不懂这些东西。 :help
 楼主| 发表于 2005-11-4 12:27:31 | 显示全部楼层
发现问题所在了,
如果连接时有.a和.o文件在一起的话,.a文件一定放在.o文件后面,否则出错。
出错:g++ -o g4 Gui/Gui.a abc.o-lXext -lX11 -lm -ldl -lGLU -lGL -lpthread
正确:g++ -o g4 abc.o Gui/Gui.a -lXext -lX11 -lm -ldl -lGLU -lGL -lpthread


哪位大大能说一下Link时参数的顺序有什么规定?
回复 支持 反对

使用道具 举报

发表于 2005-11-4 13:05:33 | 显示全部楼层
大致是前面找不到的符号会到后面的文件中找,但不会往回找。
我也顺便问个问题,如果是交叉引用的话,那应该怎么指定呢?
就是liba.so中调用libb.so中的函数B, 而libb.so中又调用了liba.so中A函数,应该怎么指定参数呢?
回复 支持 反对

使用道具 举报

发表于 2005-11-4 14:01:39 | 显示全部楼层
Post by pupilzeng

就是liba.so中调用libb.so中的函数B, 而libb.so中又调用了liba.so中A函数,应该怎么指定参数呢?


这个如果有那么两个库已经生成的话应该好说,直接把两个.so都-l就行了。关键是怎么生成这样的两个库,在生成a库的时候要调用b库的文件,但b库不存在,所以生成不了a库。生成b库也是一样,所以会有这么两个库吗?
回复 支持 反对

使用道具 举报

发表于 2005-11-4 14:27:32 | 显示全部楼层
Post by haohao_h
这个如果有那么两个库已经生成的话应该好说,直接把两个.so都-l就行了。关键是怎么生成这样的两个库,在生成a库的时候要调用b库的文件,但b库不存在,所以生成不了a库。生成b库也是一样,所以会有这么两个库吗?

生成a库并不需要b库的存在,同样生成b库也不需要a库的存在
我刚刚实验过了,确实直接同时-l上两个so库就行了,顺序无关的,这反而有点费解了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-4 14:54:42 | 显示全部楼层
好像Ln里的隐含规则太多,也很少见它的用法介绍。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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