为依赖文件生成单独的.o&

时间:2014-09-11 13:57:11

标签: c

e1.c

#include<stdio.h>
extern struct members;
int main(){
        printf("\n %d \n",members.a1);
        printf("%d",add(2,2));
        printf("%d",sub(2,2));

}

e2.c

typedef struct members_t{
        int a1;
        int b1;
}members;
int add(int a,int b){
        return (a+b);
}
int sub(int a,int b){
        return (a-b);
}

我需要单独生成.o,并且需要在创建可解决的依赖项的同时组合.o&#39;

我分别编译了e1.c并得到了以下错误,

[root@angus]# gcc -c e1.c -o e1.o
e1.c:2: warning: useless storage class specifier in empty declaration
e1.c: In function ‘main’:
e1.c:4: error: ‘members’ undeclared (first use in this function)
e1.c:4: error: (Each undeclared identifier is reported only once
e1.c:4: error: for each function it appears in.)

如何分别生成.o&而无错误。

我使用extern通知编译器这是在某处定义的,但仍然会出现上述错误。

2 个答案:

答案 0 :(得分:1)

编译e1.c时,编译器必须具有struct members_t的完整声明以及add()和sub()函数的声明(原型),所以你应该将它放在头文件。

第1步。 将声明移动到头文件。

创建新的头文件,如下所示:

#ifndef E_HEADER_H
#define E_HEADER_H

 typedef struct members_t{
        int a1;
        int b1;
}members;
int add(int a,int b);
int sub(int a,int b);
#endif

并命名此e.h

第2步。

添加

#include "e.h" 

到e1.c和e2.c.

第3步。

从e2.c中删除struct members_t的声明

第4步。

从e1.c中删除extern struct members;的前向声明

第5步。

修复代码。您需要实际创建成员struct的实例,并初始化它 成员

#include <stdio.h>
#include "e.h"
int main(int argc, char *argv[]){
        members m;
        m.a1 = 1;
        m.a2 = 2;
        printf("\n %d \n",m.a1);
        printf("%d",add(2,2));
        printf("%d",sub(2,2));

}

然后你可以按照你想要的那样编​​译文件。

答案 1 :(得分:1)

struct members是一种类型。 members不是对象,members.a1是语法错误。其他人对将类型定义放在头文件中的说法是正确的,但另外您需要定义该类型的对象。