链接c文件后即使是未定义的引用错误

时间:2015-09-04 07:56:08

标签: c++ c gcc makefile linker

我有一个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);

2 个答案:

答案 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
相关问题