我的目标是将程序分成几个文件,并使用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
答案 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;