未定义引用函数使用argv [1]将filename传递给其他函数并读取数据结构

时间:2014-12-06 13:39:34

标签: c undefined-reference

我无法解决错误:lire中函数main中对proj.c的未定义引用。

collect2: error ld returned 1 exit status

问题结构

  1. 问题详情
  2. 主要功能代码 - allouer(=分配)和lire(=读取)(文件称为allocate_plat.c
  3. proj.c源文件 - 应该将filename作为参数并使用函数lire
  4. 读取它
  5. proj.h头文件 - 结构定义和原型函数
  6. Makefile - 我无法相信这会导致问题,但包括完整性
  7. 要读取的txt文件示例。仅供参考
  8. 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
    

1 个答案:

答案 0 :(得分:1)

错误发生在Makefile中。与

CFLAGS = -I #-Wall

稍后

    $(CC) $(CFLAGS) -c -o $@ $<

将成为

gcc -I -c -o proj.o proj.c

...其中-c被解释为目录(-I的参数)。你的意思是

CFLAGS = -I . #-Wall