C编译错误与自制库

C编译错误与自制库,c,header,include,prototype,C,Header,Include,Prototype,自从我上次用C写代码已经有好几年了,所以我确信我得到的错误是非常愚蠢的,即使我彻底检查了搜索引擎。如果是这样的话,请提前道歉 我正在编写的程序越来越大,所以我决定将一些基本函数导出到自制的库“stackmat.c”中 这是有两个函数的代码, 斯塔克马特 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <math.h&

自从我上次用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;
}
和一个简单的调用程序 checkslib.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]);
}
如果我在库中包含头调用,那么这次是库编译返回几乎相同的错误


有人能看到我做错了什么吗?

-o
指定输出文件。无论
gcc
对您现有的stackmat.o做了什么,您都需要通过执行以下操作将stackmat.o包括在合规中:

>gcc checkslandlib.c stackmat.o-o checkslandlib

或者在编译的同时


gcc checkslantlib.c stackmat.c-o checkslantlib函数定义后缺少分号

#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。

这两个文件应分别编译:

gcc-c stackmat.c
生产
stackmat.o

gcc-c checkslantlib.c
生成
checkslantlib.o

然后将它们链接在一起以生成最终的可执行文件:

gcc-o我的程序checkslantlib.o stackmat.o


同时检查其他答案和评论中提到的缺少的分号。

Stackmat.h中decls结尾的分号不是缺少了吗?不幸的是,使用
void main()
的错误通常没有得到诊断<代码>int main(void)是正确的格式
void main()
在以下方面非常有用:(a)在某些嵌入式系统中,以及(b)在检测教科书和教程时,其作者对C语言的了解程度不如他们认为的那样好。我不知道这个想法是从哪里开始的;1989年引入了
void
关键字的同一个标准也指出
int
main
的正确返回类型。很抱歉,直截了当,但分号到底是什么?我想原型不需要它们。好的,它正在工作,谢谢大家。我知道我犯了个愚蠢的错误。
checkslantlib.c: In function ‘stackmat’:
checkslantlib.c:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
checkslantlib.c:13: error: expected ‘{’ at end of input
#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