关于GNU编译和连接?在线等!一经解决立即结贴!

panyaxiong 2005-03-16 09:29:04
我有文件a.h,b.s,c.c,d.c,e.c。编译能通过,但连接时总说我的fun1,fun2,fun3未定义。
后来我才发现连接时如果a.h中声明的函数它就只在a.c中去找其函数定义。请问我如何让编译器到
我对应的文件中找到对应的函数定义啊?或者说请问我什么方法可以在a.h中声明函数而在其它c文件和
汇编文件中找到对应的函数定义啊?

a.h内容:
/*我想把所有函数声明都放在这个头文件中*/
void fun1(void);
void fun2(void);
void fun3(void);

b.s内容:
.extern fun3
.global fun2/*fun2的定义*/
.func fun2
fun2:
.endfunc

c.c内容
#include "a.h"
void fun1()/*fun1的定义*/
{
}

d.c内容
#include "a.h"
void fun3()/*fun3的定义*/
{
}
e.c内容
#include "a.h"
int main()
{
fun1();
fun2();
fun3();
}
...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LDD123 2005-03-17
  • 打赏
  • 举报
回复
我试了,楼主最开始的代码在Rh Linux 9 下编译没问题,是不是编译器的版本不支持。
panyaxiong 2005-03-16
  • 打赏
  • 举报
回复
仍然不行
jellen 2005-03-16
  • 打赏
  • 举报
回复
在头文件里面加:
#ifndef ___HEADER
#define ___HEDAER

...

#endif
语句,然后在主文件里面(e.c)包含所有头文件。
tengulre 2005-03-16
  • 打赏
  • 举报
回复
up
baojiabao2003 2005-03-16
  • 打赏
  • 举报
回复
要么你把b.s里的内容放到a.h中去,要么你在a.c或者a.h中加上 #include “b.s”试试看
TangChin 2005-03-16
  • 打赏
  • 举报
回复
刚刚试了一下,Linux 7.3 Gcc 2.96环境下,我编译ok啊
没问题啊。

你在试试,用 gcc -o test b.s c.c d.c e.c ,应该不会有问题。
TangChin 2005-03-16
  • 打赏
  • 举报
回复
看了一下,应该是你b.s有问题,可能是你汇编代码有问题,要是用C来实现,完全OK。
你a.h, c.c ,b.c , e.c得用法没问题(建议头文件还是使用#ifndef 机制)

你说“如果a.h中声明的函数它就只在a.c中去找其函数定义”,我不知道你是怎么推断的。
但实事不是这样的,gcc在链接得时候,会自动得在你指定编译的每个文件中去找对应函数的定义。
alaiyeshi 2005-03-16
  • 打赏
  • 举报
回复
同意楼上的说法
qfxx 2005-03-16
  • 打赏
  • 举报
回复
在e.c中使用声明
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);

去掉#include
DanXer 2005-03-16
  • 打赏
  • 举报
回复
a.h里的函数声明改为
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);

23,110

社区成员

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

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