2011-03-25 81 views
0

- >代表 「包括」Make文件錯誤

list.c - > list.h

matrix.c - > matrix.h

smatrix.c - > smatrix.h

SMATRIX .h文件 - > 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東西liet 文件名

我該如何解決這個問題?

CNC中 我改變* o文件用gcc -c代替gcc的-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 ...如何解決這個問題?

+2

對於* .o文件,您需要使用'gcc -c -g ...'。 – 2011-03-25 12:39:19

+0

如果您嘗試手動運行生成文件中的命令,會發生什麼情況?第一個錯誤發生在哪裏?你究竟輸入了什麼,並拋出了什麼錯誤? – 2011-03-25 12:39:58

回答

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 
+0

嘗試編譯輸出文件時不能使用輸出文件,即在其自身的目標文件生成中使用smatrix.o。 – 2011-03-25 12:50:34

+0

@Evan Mulawski:我不使用該文件。 '-o smatrix.o'開關的意思是「輸出文件的名稱是smatrix.o」 – 2011-03-25 12:55:16

+0

太棒了!但是,你能否解釋爲什麼我需要在gcc -g -c -o ...行中添加smartix.o? – codereviewanskquestions 2011-03-25 13:02:04

0

正如我的評論說,產生在調用GCC時需要使用-c選項的目標文件:

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

請注意,您不使用-o選項,直到您編譯最終方案。

您可以選擇添加-ansi -pedantic -Wall,我覺得這非常有用。

0

對於新問題,gcc默認爲它自己的標準而不是c99。

如果您希望您的代碼以符合C99,添加:

-std = C99

其他你需要你在循環使用它之前定義循環變量。

void function(size_t height) 
{ 
    size_t i; 

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