出错文件
– >代表“包含”
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一些liet filename
我该如何解决这个问题?
-edit-我用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 data[i] = malloc(sizeof(int)*width); m->data[i] = calloc(width, sizeof(int)); if(m->data[i] == NULL){ for(size_t j = 0; j data[j]); free(m->data); free(m); return 0; } if(opt == nonzero_matrix_k_off){ for(size_t j = 0; j data[i][j] = 2; } } }
它与xcode4一起运行良好…如何解决这个问题?
您需要添加-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
正如我的评论所述,要生成目标文件,您需要在调用GCC时使用-c
选项:
list.o: list.c list.h gcc -c -g list.c
请注意,在编译最终程序之前,请勿使用-o
选项。
您可以选择添加-ansi -pedantic -Wall
,我发现它非常有用。
对于新问题,gcc默认为自己的标准,而不是c99。
如果您希望代码符合c99,请添加:
-std = C99
否则你需要在循环中使用它之前定义循环变量。
即
void function(size_t height) { size_t i; for(i=0;i