分割C档案并使用Makefile

时间:2018-10-04 03:14:35

标签: c debugging makefile

我的目标是将程序分成几个文件,并使用Makefile来运行它。但是,我不断收到此错误: 我也曾经在主文件中初始化过“ int top”,但我认为这可能是问题所在,但是仍然没有结果,而且如果有人知道问题,我似乎也找不到任何在线方法可以帮助解决此错误或他们可以向我推荐的有用资源:)

gcc -o hw5 hw5.o pushnpop.o
pushnpop.o:(.bss+0x0): multiple definition of `top'
hw5.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'hw5' failed
make: *** [hw5] Error 1

********这是我的代码*********** ******* hw5.c *********

#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include "pushnpop.h"
#define MAX 100


int emptyCheck(char *stack)
{
  if(stack[0] == '\0')
    return 1;
  else
    return 0;
}

int main()
{
  /*int top = 0;*/
  char c;
  char line[10000];
  FILE *file;
  char stack[MAX];
  char fileName;
  printf("Please enter a file name with a .c extension\n");
  scanf("%s", &fileName);
  /*printf("testing the name:%s\n", &fileName);*/
  file = fopen(&fileName, "r");

  /*error checking*/
  if (file == NULL)
  {
    printf("Cannot access file\n");
    exit(0);
  }

  for(int i = 0; i < MAX; i++ )
  {
    stack[i] = '\0';
  }


/*getting the data from the file*/
int lineCounter = 1;
while(fgets(line, 10000, file) != NULL)
  {
    int j = 0;
    while(line[j] != '\n')
    {
      if(line[j] == '{')
      {
        push(stack);
      }
      else if(line[j] == '}')
      {
        if(emptyCheck(stack) == 1)
        {
        printf("too many } on line %d\n", lineCounter);
        break;
        }
        else
         pop(stack);
      }

    j++;

    }

    if(emptyCheck(stack)==0)
    {
      printf("too many { on line %d\n", lineCounter);
    }

    if(fgets(line, 10000, file) == NULL)
    {
      printf("END of FILE\n");
      exit(0);
    }

    for(int i = 0; i<MAX; i++)
      stack[i] = '\0';

    lineCounter++;
    top = 0;

  }

  fclose(file);
  return 0;
}

****我的第二个文件***** ***** pushnpop.c ******

#include "pushnpop.h"


char pop(char *stack)
{
  char *temp;

    temp = stack;
    top--;
    temp[top] = '\0';

  return *temp;
}

char push(char *stack)
{
  char *temp;

  temp = stack;
  temp[top] = '{';
  top++;

  return *temp;
}

******我的第三个文件****** **** pushnpop.h *******

#ifndef pnp
#define pnp

int top = 0;
char pop(char *stack);
char push(char *stack);

#endif

******** MAKEFILE ********

all: hw5
hw5: hw5.o pushnpop.o
    gcc -o hw5 hw5.o pushnpop.o

pushnpop.o: pushnpop.c
    gcc -o pushnpop.o -c pushnpop.c -W -Wall -pedantic

hw5.o: hw5.c pushnpop.h
    gcc -o hw5.o -c hw5.c -W -Wall -pedantic

clean:
    rm -rf *.o

mrproper: clean
    rm -rf pushnpop

2 个答案:

答案 0 :(得分:1)

第1步,将int top移至pushnpop,并且不从top访问main。喜欢,

// pushnpop.c
#include "pushnpop.h"

int top = 0;

char pop(char *stack)
{

然后修改pushnpop.h以声明函数extern。喜欢,

// pushnpop.h
#ifndef pnp
#define pnp

extern char pop(char *stack);
extern char push(char *stack);

#endif

别忘了发表评论

// top = 0;

main中。

答案 1 :(得分:0)

问题出在头文件@Singleton

@Singleton
class GithubViewModelFactory @Inject constructor(
    private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }

    }
}

您需要将此标记为extern。通常,不应在头文件中定义变量。如果需要两个或多个文件,则应在标题中将它们标记为extern。

pushnpop.h

此外,在一个.c文件(可能是int top = 0; )中,您需要在全局空间中定义变量。

extern int top;