【问题标题】:undefined reference error even after linking c files [duplicate]即使在链接 c 文件后未定义的引用错误 [重复]
【发布时间】:2015-09-04 07:56:08
【问题描述】:

我有一个 main.cpp 文件和一个 read.c 文件。我正在从 read.c 文件中定义的主函数调用函数 read_int。我还在 read.h 文件中声明了该函数,并将该文件包含在 main.cpp 中。但是当我尝试编译时,我收到“未定义的 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);

【问题讨论】:

标签: c++ c gcc makefile linker


【解决方案1】:

这是因为当您在 C++ 文件中包含标头时,名称“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”,否则如果你在一个地方更改函数的原型而忘记另一个地方,一切都会神秘地破坏。

【讨论】:

  • 谢谢。解决了这个问题
【解决方案2】:

不应该

#include "read.h"

在 read.c 的顶部?

read.h应该包含

#ifndef READ_H
#define READ_H
…
#endif

【讨论】:

  • read.h 文件位于不同的目录中。这就是为什么我有 ./input/read.h
  • 我谈到了 read.c 文件,而不是 main.cpp。顺便说一句,为什么不是 main.c?
  • 不,我不需要在 read.c 中包含 read.h。这是因为只有 main.cpp 需要在 read.h 中声明 read_int
猜你喜欢
  • 2013-01-11
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2016-12-10
  • 2014-02-13
  • 2014-09-02
  • 2013-04-01
相关资源
最近更新 更多