我有一个main.cpp文件和一个read.c文件。我从read.c文件中定义的main函数调用函数read_int。我也在read.h文件中声明了该函数,并且我已将该文件包含在main.cpp中。但是当我尝试编译时,我得到了#read;未定义的引用read_int"错误。
用于编译的命令是:
gcc -c ./input/read.c -o ./bin/input/read.o
gcc ./main.cpp ./bin/input/read.o -o ./bin/main.out
main.cpp文件:
#include<stdio.h>
#include "./input/read.h"
int main() {
int *vectorA = (int *) malloc(sizeof(int)*VECTOR_A_SIZE);
int *vectorB, *matrixA, *matrixB;
int *flags = (int *)malloc(sizeof(int)*4);
flags[0] = 1;
read_int(vectorA, vectorB, matrixA, matrixB, flags);
}
read.c文件是
#include<stdio.h>
int read_int(int *vectorA, int *vectorB, int *matrixA, int *matrixB, int *flags) {
int flag_count = 4;
int err = 0;
FILE *fp = fopen("input_int.txt","R");
int i,j;
if(flags[0]) {
for(i = 0; i < VECTOR_A_SIZE; i++) {
fscanf(fp, "%d", (vectorA + i));
}
}
fclose(fp);
return 0;
}
read.h文件是
int read_int(int *vectorA, int *vectorB, int *matrixA, int *matrixB, int *flags);
答案 0 :(得分:3)
这是因为当您在C ++文件中包含标题时,名称“read_int”被“损坏”。
C ++编译器使用类型信息修饰名称以启用重载。
你需要告诉C ++编译器它实际上是一个C函数
这是通过链接说明符extern "C"
完成的。
把它放在“read.h”中:
#ifdef __cplusplus
extern "C" {
#endif
int read_int(int *vectorA, int *vectorB, int *matrixA, int *matrixB, int *flags);
#ifdef __cplusplus
}
#endif
请记住在你的C文件中包含“read.h”,否则如果你在一个地方更改了函数的protype而忘记了另一个,那么一切都会神秘地破解。
答案 1 :(得分:0)
不应该是
#include "read.h"
在read.c的顶部?
read.h 应包含
#ifndef READ_H
#define READ_H
…
#endif