当前位置: 技术问答>linux和unix
关于GNU编译和连接?在线等!一经解决立即结贴!
来源: 互联网 发布时间:2015-09-15
本文导语: 我有文件a.h,b.s,c.c,d.c,e.c。编译能通过,但连接时总说我的fun1,fun2,fun3未定义。 后来我才发现连接时如果a.h中声明的函数它就只在a.c中去找其函数定义。请问我如何让编译器到 我对应的文件中找到对应的函数定义啊?...
我有文件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();
}
后来我才发现连接时如果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();
}
|
看了一下,应该是你b.s有问题,可能是你汇编代码有问题,要是用C来实现,完全OK。
你a.h, c.c ,b.c , e.c得用法没问题(建议头文件还是使用#ifndef 机制)
你说“如果a.h中声明的函数它就只在a.c中去找其函数定义”,我不知道你是怎么推断的。
但实事不是这样的,gcc在链接得时候,会自动得在你指定编译的每个文件中去找对应函数的定义。
你a.h, c.c ,b.c , e.c得用法没问题(建议头文件还是使用#ifndef 机制)
你说“如果a.h中声明的函数它就只在a.c中去找其函数定义”,我不知道你是怎么推断的。
但实事不是这样的,gcc在链接得时候,会自动得在你指定编译的每个文件中去找对应函数的定义。
|
我试了,楼主最开始的代码在Rh Linux 9 下编译没问题,是不是编译器的版本不支持。
|
要么你把b.s里的内容放到a.h中去,要么你在a.c或者a.h中加上 #include “b.s”试试看
|
在头文件里面加:
#ifndef ___HEADER
#define ___HEDAER
...
#endif
语句,然后在主文件里面(e.c)包含所有头文件。
#ifndef ___HEADER
#define ___HEDAER
...
#endif
语句,然后在主文件里面(e.c)包含所有头文件。
|
a.h里的函数声明改为
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
|
在e.c中使用声明
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
去掉#include
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
去掉#include
|
同意楼上的说法
|
刚刚试了一下,Linux 7.3 Gcc 2.96环境下,我编译ok啊
没问题啊。
你在试试,用 gcc -o test b.s c.c d.c e.c ,应该不会有问题。
没问题啊。
你在试试,用 gcc -o test b.s c.c d.c e.c ,应该不会有问题。
|
up