使文件错误

时间:2011-03-25 12:35:46

标签: c

- >代表“包含”

list.c - > list.h

matrix.c - > matrix.h

smatrix.c - > smatrix.h

smatrix h file - > list.h和matrix.h文件

test.c - > test.h

test.h - > list.h,matrix.h和smatrix.g文件

现在我有了这个makefile

all: run

run: test.o list.o matrix.o smatrix.o
    gcc test.o list.o matrix.o smatrix.o -o matrix-mul

list.o: list.c list.h
    gcc -g list.c 

matrix.o: matrix.c matrix.h
    gcc -g matrix.c 

smatrix.o: smatrix.c smatrix.h
    gcc -g smatrix.c 

test.o: test.c test.h
    gcc -g test.c 

现在我正在

Undefined symbols for architecture x86_64:
  "_make_matrix", referenced from: //make_matrix defines in matrix.h
      _main in cctU8RoB.o
  "_print_matrix", referenced from://print_matrix defines in list.h
      _main in cctU8RoB.o
  "_make_smatrix", referenced from://make_smatrix defines in smatrix.h
      _main in cctU8RoB.o
  "_multiply_by_vector", referenced from://muliply_by_vector defines in smatrix.h
      _main in cctU8RoB.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [test.o] Error 1

我正在调用test.c中其他文件中定义的那些函数,test.h包含test.c文件中调用的函数的所有头文件。所有头文件都包含gard某些内容 filename

我该如何解决这个问题?

CNC中 我用gcc -c而不是gcc -o更改了* o文件,现在我得到了

matrix.c:33: error: ‘for’ loop initial declaration used outside C99 mode
matrix.c:38: error: ‘for’ loop initial declaration used outside C99 mode
matrix.c:44: error: ‘for’ loop initial declaration used outside C99 mode
matrix.c: In function ‘make_matrix_k’:
matrix.c:58: error: ‘for’ loop initial declaration used outside C99 mode
matrix.c: In function ‘print_matrix’:
matrix.c:73: error: ‘for’ loop initial declaration used outside C99 mode
matrix.c:74: error: ‘for’ loop initial declaration used outside C99 mode

//for loop in matrix.c file
for(size_t i=0; i < height; i++){
        //m->data[i] = malloc(sizeof(int)*width);
        m->data[i] = calloc(width, sizeof(int));

        if(m->data[i] == NULL){
            for(size_t j = 0; j < i; j++) free(m->data[j]);
            free(m->data);
            free(m);
            return 0;
        }
        if(opt == nonzero_matrix_k_off){
            for(size_t j = 0; j < width; j++){
                m->data[i][j] = 2;
            }
        }
    }

它与xcode4一起工作正常...如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您需要添加-c选项以使gcc生成目标文件,并-o name来命名它。例如:

smatrix.o: smatrix.c smatrix.h
    gcc -g -c -o smatrix.o smatrix.c

要解决第二个问题,请将-std=c99开关添加到gcc参数列表。而且,正如Evan Mulawski所说,你不需要-o开关。

smatrix.o: smatrix.c smatrix.h
    gcc -g -std=c99 -c smatrix.c

答案 1 :(得分:0)

正如我的评论所述,要生成目标文件,您需要在调用GCC时使用-c选项:

list.o:  list.c list.h
         gcc -c -g list.c

请注意,在编译最终程序之前,请勿使用-o选项。

您可以选择添加-ansi -pedantic -Wall,我觉得这非常有用。

答案 2 :(得分:0)

对于新问题,gcc默认为自己的标准,而不是c99。

如果您希望代码符合c99,请添加:

-std = C99

否则你需要在循环中使用它之前定义循环变量。

void function(size_t height)
{
    size_t i;

    for(i=0;i<height;i++)
    {
     ...
    };
 }