在C中将makefile与多个文件一起使用时很麻烦

| 开始让我的C程序了解makefile,但是尝试包含多个文件时遇到了一些麻烦。忽略以下程序是不完整的事实(就功能而言,而不是编译而言),我试图使用make文件来使该程序编译并运行。 这是我的make文件:
main: main.o IntList.o
    gcc -o main main.o IntList.o

main.o: main.c
    gcc -c -ansi -pedantic -Wall main.c

IntList.o: IntList.c IntList.h
    gcc -c -ansi -pedantic -Wall Intlist.c
这是我收到的错误:
gcc -c -ansi -pedantic -Wall Intlist.c
gcc -o main main.o IntList.o
ld: duplicate symbol _getNewInt in IntList.o and main.o
collect2: ld returned 1 exit status
make: *** [main] Error 1
该程序的代码如下。我不确定是导致问题的Make文件还是程序文件中的包含问题(或两者都有!) 任何帮助都会很棒。干杯。 编辑:指导我在模块化方面朝正确方向发展的任何技巧将不胜感激,因为我不确定我是否以最佳方式这样做。 IntList.h
#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

/* Constants */
#define MAX_INTS 10

/* Signed ints can have a maximum of 10 digits. We make the length 11 to 
 * allow for the sign in negative numbers */
#define MAX_INPUT_LENGTH 11
#define EXTRA_SPACES 2

/* Typedefs / Structs */
typedef struct {
   int list[MAX_INTS];
   int noInts;
} IntList;

/* Proto Types */
int insertIntToList(int *list);
void shiftList(int offset);
void displayList();
IntList.c
#include \"IntList.h\"

int getNewInt(int *list)
{
   int valid = 0, inputInt;
   char inputString[MAX_INPUT_LENGTH + EXTRA_SPACES];

   while(!valid)
   {
      printf(\"Input an int: \");

      valid = 1;

      if((fgets(inputString, MAX_INPUT_LENGTH + EXTRA_SPACES, stdin)) != NULL)
      {
         sscanf(inputString, \"%d\", &inputInt);
         /* Check first that the input string is not too long */
         if(inputString[strlen(inputString) - 1] != \'\\n\')
         {
            printf(\"\\nError: Too many characters entered \\n\");
            valid = 0;
         }

         printf(\"\\nThe Int: %d\", inputInt);
         printf(\"\\n\");
      }
   }
}

void shiftList(int offset)
{
}

void displayList()
{
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include \"IntList.c\"

int main(void)
{
   int intList[10];

   getNewInt(intList);

   return EXIT_SUCCESS;
}
    
已邀请:
主目录中不要包含
.c
文件,而应包含
.h
文件。否则,ѭ7中的代码将同时编译为
IntList.o
main.o
,因此您将获得重复的符号。 在main.c而不是ѭ7中使用此命令:
#include \"IntList.h\"
    
#include \"IntList.c\"
应该:
#include \"IntList.h\"
另外(尽管与您的问题无关),我建议不要在源文件的名称中使用大小写混合,因为这会导致可移植性问题,并且难以诊断“没有此类文件”错误-请使用小写字母,例如标准库头就可以了。     
不要将14英镑变成15英镑     
你不应该:
#include \"IntList.c\"
在您的主程序中,它应该是:
#include \"IntList.h\"
通过包含C文件,可以在
main
IntList
目标文件中创建
getNewInt
,这就是为什么在尝试将它们链接在一起时会出现重复定义错误。     
main.c应该包含\“ IntList.h \”,而不是\“ IntList.c \”。 如果包含IntList.c,则IntList.c和main.o中都将实现IntList.c中的功能,这将产生您看到的“重复符号”错误。     
正如其他人提到的那样,您包括.h文件,而不包括.c文件 同样,在编译时,您仅编译.c文件,因此您应该在Makefile中删除对.h文件的所有引用     

要回复问题请先登录注册