2017-05-09 29 views
-1

我遇到了makefile文件的问题。当我编译时,我得到了很多问题。我的主要问题是弄清楚我应该把我的全局常量放在我的程序中。我试图把它们都放在主文件中,但似乎没有工作。makefile文件常量声明和结构问题时出错

banksystem: main.o admin.o customer.o 
    gcc -o banksystem main.o admin.o customer.o 

main.o: main.c admin.h customer.h 
    gcc -c main.c 

admin.o: admin.c admin.h basefunctions.h 
    gcc -c admin.c 

customer.o: customer.c customer.h basefunctions.h 
    gcc -c customer.c 

basefunctions.o: basefunctions.c basefunctions.h 
    gcc -c basefunctions.c 

这就是我制作makefile的过程。我真的不知道这是否正确。在做这个测试每个函数之前,我把整个代码放到一个文件中,但是现在我试图分解它。我得到一吨的错误与我的常量和结构

struct info{ //Example struct 
    int a; 
    int b; 
}; 
struct info collection[MAX]; //Example array 

我不知道放在哪个文件在此以及其他全球常量

#define MAX 100 
#define char "customerdata.txt" 
typedef int (*compfn)(const void*, const void*) 

我应该把这些变量主要的源文件?或者我应该把它们放在basefunctions源文件中,也应该如何在不包含我的结构信息的文件中使用extern,或者我猜,我该如何处理我的结构?我所有的功能都使用它。我所有的函数都使用这个数组。

代码非常冗长,所以我不打算包含它。我要问的要点,

当我有一个struct,结构数组,全局const const,全局char常量时,如何重新格式化我的代码以在makefile中工作。

void load(){ 
     FILE *fp; 

     fp = fopen(FILE_NAME, "rb"); 
     if (fp != NULL){ 
       fread(collection, sizeof(struct userinfo), MAX, fp); 
     } 
     else{ 
       printf("ERROR"); 
     } 
     fclose(fp); 
} 

void save(){ 
     FILE *fp; 

     fp = fopen(FILE_NAME, "wb"); 
     fwrite (collection, 1, sizeof(collection), fp); 
     fclose(fp); 
} 

我也越来越具有这两种功能

warning: passing argument 1 of ‘fopen’ makes pointer from integer without a 
cast [-Wint-conversion] 
    fp = fopen(FILE_NAME, "rb"); 
       ^

对不起这个警告,如果这是漫长的和模糊的帮助将是非常赞赏

+0

这个问题有没有关系的makefile - 你有同样的问题* *没有一个makefile,如果你只是跑自己的所有命令。 – immibis

+0

如果您可以发布单独的问题而不是将问题合并为一个问题,那么这是首选。这样,它可以帮助人们回答你的问题,也可以帮助其他人至少狩猎你的一个问题。谢谢! –

回答

-1

我所提到的一些建议关于头文件中的全局变量

你应该把所有的全局变量放在头文件中 保护头文件, ES不是在你的头文件的顶部

#ifndef __MYHEADER__FILE__ 
#define __MYHEADER__FILE__ 
#endif 

添加此声明的每个全局变量(比如myheader.h)获得包括在同一个目标(.o)两次应delared作为例如

MYEXTERN struct info collection[MAX]; 

如果包含,myheader。在多个C文件 h。在C文件中的任何一个(preferrable其中主要在存在)包括它作为

#define MYEXTERN 
#include<myheader.h> 

这确保收集被声明为结构信息集合[MAX]

在C的其余部分文件,你应该把它作为

#define MYEXTERN extern 
#include<myheader.h> 

这确保集合声明为extern结构信息收集[MAX]

-1
banksystem: main.o admin.o customer.o 
gcc -o banksystem main.o admin.o customer.o 

我只是需要包括basefunctions.o在这里,它编译和作品