我写的程序越来越大,所以我决定将一些基本功能导出到一个自制的库“stackmat.c”中。 这是具有两个函数的代码, stackmat.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
//#include "stackmat.h"
double *stackmat(double *A, int sizeA[2], int dim)
// dim = 0, output is 1 row of sizeA[0] elements
// dim = 1, output is 0 column of sizeA[1] elements
{ double *B;
int i;
B = calloc(sizeA[dim],sizeof(double));
if (dim == 1) // size sizeA[1]
{ for (i=0; i<sizeA[0]*sizeA[1]; i++) B[i%sizeA[1]] += A[i];
}
else // size sizeA[0]
{ for (i=0; i<sizeA[0]*sizeA[1]; i++) B[i/sizeA[1]] += A[i];
}
return B;
}
double *SumMat(double *A, double *B, int sizeA[2], int sizeB[2])
{ int i;
double *C;
C = calloc(sizeA[0]*sizeA[1],sizeof(double));
for (i=0; i<sizeA[0]*sizeA[1]; i++) C[i] = A[i] + B[i];
return C;
}
标题 stackmat.h
#ifndef STACKMAT_H_INCLUDED
#define STACKMAT_H_INCLUDED
double *stackmat(double *A, int sA[2], int dim)
double *SumMat(double *A, double *B, int sizeA[2], int sizeB[2])
#endif
一个简单的调用程序 checkslantlib.c
#include <stdio.h>
#include <stdlib.h>
#include "stackmat.h"
void main()
{ double *A, *B;
int i, sA[2] = {4,3};
A = malloc(12*sizeof(double));
for (i=0; i<12; i++) A[i] = (double) 0.5+i;
for (i=0; i<12; i++) printf(" %.1f",A[i]);
B = stackmat(A,sA,1);
for (i=0; i<3; i++) printf(" %.1f",B[i]);
}
使用“gcc -c stackmat.c”进行编译时,一切都很好。 但是“gcc checkslantlib.c -o stackmat.o”会返回一个我无法理解的错误
checkslantlib.c: In function ‘stackmat’:
checkslantlib.c:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
checkslantlib.c:13: error: expected ‘{’ at end of input
如果我在库中包含标头调用,这次是库编译,它会返回几乎相同的错误。
有人能看到我做错了吗?
答案 0 :(得分:1)
-o
指定输出文件。不用担心gcc
对现有的stackmat.o做了什么,你需要通过以下方式包含stackmat.o:
> gcc checkslantlib.c stackmat.o -o checkslantlib
或已编译以及
> gcc checkslantlib.c stackmat.c -o checkslantlib
答案 1 :(得分:0)
您在函数定义后缺少分号。
#ifndef STACKMAT_H_INCLUDED
#define STACKMAT_H_INCLUDED
double *stackmat(double *A, int sA[2], int dim);
double *SumMat(double *A, double *B, int sizeA[2], int sizeB[2]);
#endif
编译stackmat.c时没有出错,因为你已经注释了#include。
答案 2 :(得分:0)
这两个文件应该分开编译:
gcc -c stackmat.c
生成stackmat.o
gcc -c checkslantlib.c
生成checkslantlib.o
然后将它们链接在一起以生成最终的可执行文件:
gcc -o myprogram checkslantlib.o stackmat.o
还要检查其他答案中提到的缺失分号&amp;评价。