未定义的引用错误,即使在链接 c 文件之后
undefined reference error even after linking c files
我有一个 main.cpp 文件和一个 read.c 文件。我正在从 read.c 文件中定义的主函数调用函数 read_int。此外,我已在 read.h 文件中声明了该函数,并将该文件包含在 main.cpp 中。但是当我尝试编译时出现 "undefined reference to 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);
不应该吗
#include "read.h"
在 read.c 的顶部?
而read.h应该包含
#ifndef READ_H
#define READ_H
…
#endif
这是因为当您在 C++ 文件中包含 header 时,名称 "read_int" 是 "mangled"。
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",否则如果你在一个地方改变了函数的原型而忘记了另一个地方,一切都会莫名其妙地崩溃。
我有一个 main.cpp 文件和一个 read.c 文件。我正在从 read.c 文件中定义的主函数调用函数 read_int。此外,我已在 read.h 文件中声明了该函数,并将该文件包含在 main.cpp 中。但是当我尝试编译时出现 "undefined reference to 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);
不应该吗
#include "read.h"
在 read.c 的顶部?
而read.h应该包含
#ifndef READ_H
#define READ_H
…
#endif
这是因为当您在 C++ 文件中包含 header 时,名称 "read_int" 是 "mangled"。
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",否则如果你在一个地方改变了函数的原型而忘记了另一个地方,一切都会莫名其妙地崩溃。