c++ - undefined reference 错误,即使在链接 c 文件之后

标签 c++ c gcc makefile linker

<分区>

我有一个 main.cpp 文件和一个 read.c 文件。我从 read.c 文件中定义的主函数调用函数 read_int。我还在 read.h 文件中声明了该函数,并将该文件包含在 main.cpp 中。但是,当我尝试编译时,出现“对 read_int 的 undefined reference ”错误。

编译使用的命令是:

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);

最佳答案

这是因为当您在 C++ 文件中包含 header 时,名称“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”,否则如果您在一个地方更改了函数的原型(prototype)而忘记了另一个地方,一切都会莫名其妙地崩溃。

关于c++ - undefined reference 错误,即使在链接 c 文件之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32392924/

相关文章:

C 指针和地址

c - 在c中使用struct访问多个堆栈

不使用 libc 编译

c++ - 程序继续崩溃 [Project Euler #21]

C++ 11 : How to write 2 template functions that differ in their return type

c++ - Q工具栏 : Displaying the menu when toolbutton is pressed - DownArrow Issue

c - 如果从 int 更改为 double,插入排序算法是否会受到影响?

c++ - VS2013 中 HTMLhelp 的替代品

c++ - 为什么 gcc 生成一个 memmove 而不是 memcpy 来复制 std::vector<>?

c - gcc 的 wrap 选项对函数 printf 有影响吗?