我无法解决错误:lire
中函数main
中对proj.c
的未定义引用。
collect2: error ld returned 1 exit status
问题结构
allouer
(=分配)和lire
(=读取)(文件称为allocate_plat.c
)proj.c
源文件 - 应该将filename作为参数并使用函数lire
proj.h
头文件 - 结构定义和原型函数Makefile
- 我无法相信这会导致问题,但包括完整性1.这是我第一次使用多个源文件 - 目标是为这样的游戏打开游戏板:http://www.rci-jeux.com/jeux/labychiffres/laby.swf。
我在国外学习,在与讲师进行技术讨论时遇到一些麻烦,并且认为我对指针的理解或至少在何时何地使用*和&很弱 - 我已经花了一些时间试图将游戏文件从proj.c的命令行传递到allocate_plat.c - 我相信这是有效的,但是如果你发现了一个错误,请指出它。代码如下 - 对结构有指导,因此我们相信它们是合适的。
我尝试了什么 - 目前的情况是将文件名参数从proj.c
传递给allocate_plat.c
几个小时(我希望)消除错误的高潮这是我第一次看到这种类型的错误,我不知道从哪里开始。
我已阅读C++ Undefined reference to function implemented and templated in code,但看不到解决方案。
2. allocate_plat.c
分配空间,然后阅读游戏数据(这与每周作业中使用的矩阵数据结构类比,我们被告知我们可以在很大程度上复制它,所以它应该工作,(虽然为此我只使用了一个源文件。)
#include <stdio.h>
#include <stdlib.h>
#include "proj.h"
int allouer(PLATEAU *PLAT, int nl, int nc, int ldep, int cdep, int larr, int carr, int longdem, int sumdem){
int i,succes;
PLAT->grille = (int**)calloc(nl,sizeof(int*));
PLAT->nl = nl;
PLAT->nc = nc;
PLAT->longdem = longdem;
PLAT->sumdem = sumdem;
PLAT->dep.indl = ldep;
PLAT->dep.indc = cdep;
PLAT->arr.indl = larr;
PLAT->arr.indc = carr;
succes = (PLAT->grille != NULL);
for (i=0; succes && i<nl;i++){
PLAT->grille[i]=(int*)calloc(nc,sizeof(int));
succes = (PLAT->grille[i] != NULL);
}
return succes;
}
int lire(char *nom_fichier, PLATEAU *PLAT){
int i,j,succes, c;
PLATEAU jeu;
FILE *fp;
fp = fopen(nom_fichier, "rt");
if(fp==NULL) {
printf("Erreur d'ouverture du fichier\n");
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->nl,&PLAT->nc);//Read first line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->dep.indl,&PLAT->dep.indc);//Read second line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->arr.indl,&PLAT->arr.indc);//Read third line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->longdem,&PLAT->sumdem);//Read fourth line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
//ALLOCATE THE FILE TO THE STRUCT
succes = allouer(PLAT, PLAT->nl, PLAT->nc, PLAT->dep.indl, PLAT->dep.indc, PLAT->arr.indl, PLAT->arr.indc, PLAT->longdem, PLAT->sumdem );
if(succes==0) {
printf("Erreur d'allocation\n");
fclose(fp);
return 0;
}
for(i=0; i< PLAT->nl; i++){
for(j=0; j<PLAT->nc; j++){
c=fscanf(fp, "%d", &PLAT->grille[i][j]);
if(c != 1){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
}
}
fclose(fp);
return 1;
}
3.主要源文件:proj.c
#include <stdio.h>
#include <stdlib.h>
#include "proj.h"
int main(int argc, char* argv[]){
// char nom_fichier[25];
int choix, choix2, succes;
PLATEAU jeu;
if (argc > 1){
char *nom_fichier = argv[1];
lire(nom_fichier, &jeu);
}
return 0;
}
4.我的头文件:proj.h
#pragma once
typedef struct position_st{//position st is tag for the type: "struct posiition_st"
int indl;//indice of ligne
int indc;//indice of colonne
}POSITION;
typedef struct element_st{
POSITION valeur;
struct element_st *P_suivant;
}ELEMENT;
typedef struct pile_st{
ELEMENT * P_sommet;
} PILE;
//##########PLATEAU STRUCTURE DEFINITION##############
typedef struct plat_st{
//########## INFORMATION INCLUDED IN THE GAME FILES ###################
POSITION dep;//start position
POSITION arr;//finishing position
int longdem;//length of path requested
int sumdem;//total demanded
int nl;//number of rows in grille
int nc;//number of columns in grille
int ** grille;//Playing table
//########## PART TO DO WITH THE CURRENT GAME ###################
int longcur;//current length
int sumcur;//current total
PILE chemin;//the path
}PLATEAU;
//########## FUNCTION PROTOTYPES ########################
//allouer allocates the variables for the game
int allouer(PLATEAU *, int, int, int, int, int, int, int, int);
//lire reads a game from a file
int lire(char *, PLATEAU *);
5.我makefile
:
CC = gcc
CFLAGS = -I #-Wall
DEPS = proj.h
OBJ = proj.o allocate_plat.o
%.o: %.c $(DEPS)
$(CC) $(CFLAGS) -c -o $@ $<
proj: $(OBJ)
gcc $(CFLAGS) -o $@ $^
6.文件结构的示例(可能不需要注释)
4 4// number of orws and columns in board
1 1//starting coordinates (based at 1)
4 4//ending coordinates (based at 1)
11 96//path length and sum of elements of path required
10 13 2 5//board grid
3 15 9 4
8 6 11 14
7 12 1 16
答案 0 :(得分:1)
错误发生在Makefile中。与
CFLAGS = -I #-Wall
稍后
$(CC) $(CFLAGS) -c -o $@ $<
将成为
gcc -I -c -o proj.o proj.c
...其中-c
被解释为目录(-I
的参数)。你的意思是
CFLAGS = -I . #-Wall