超奇怪的连接错误

nmzrl 2010-04-12 05:31:25
文件结构:
APP
|_UI
| |_UI.cpp
|_GUI
| |_GUI.cpp
|_main.cpp

UI中实例化了一个GUI中的类,main中实例化了UI中的一个类
makefile是将UI,GUI目录先编译成UI.a, GUI.a,然后连接就报错
undefined reference to GUI....
但是直接用UI.o,GUI.o连接的话就没问题
不知道为什么,希望高手给解答一下,make方法如下

--------------------------------------------
.a的编译命令:
$(AR) rcs $(OUT_FILE) $(OBJ_FILE)
连接命令:
$(CXX) $(LINK_OPTS) ... UI.a GUI.a ... #连接会报错
$(CXX) $(LINK_OPTS) ... UI.o GUI.o ... #连接没问题,程序可以运行
--------------------------------------------
...全文
68 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmzrl 2010-04-13
  • 打赏
  • 举报
回复
没白了,非常感谢!!
mymtom 2010-04-12
  • 打赏
  • 举报
回复
动态库不会有这种问题,静态库才会出现,
静态连接的要求如下的顺序
被调用的函数所在的库,需要在调用此函数的库之"至少"出现一次。
如果真的“要是UI中引用GUI中的类,GUI中又引用UI中的另一个类”
可以
$(CXX) $(LINK_OPTS) $@ $(OBJS) UI.a GUI.a UI.a
注意这里UI.a出现了两次

如果 A.a 调用 B.a里的函数, A.a调用 B.a里的函数调用 C.a里的函数
$(CXX) $(LINK_OPTS) $@ (OBJS) A.a B.a C.a A.a
就可以了。

如果A.a B.a C.a三个库都调用其两个库里的函数
$(CXX) $(LINK_OPTS) $@ (OBJS) A.a B.a C.a A.a B.a
应该就可以了。
nmzrl 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymtom 的回复:]
试试
$(CXX) $(LINK_OPTS) ... UI.a GUI.a UI.a
[/Quote]
非常感谢,原来上顺序的问题啊,UI.a GUI.a换了位置过啦O(∩_∩)O~

静态库顺序有什么规则,为什么会出问题,讲讲呗:)
要是UI中引用GUI中的类,GUI中又引用UI中的另一个类,岂不是死锁啦~~
-->实际确认过,却可以过去,why。。。
mymtom 2010-04-12
  • 打赏
  • 举报
回复
试试
$(CXX) $(LINK_OPTS) ... UI.a GUI.a UI.a

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧