C编译 - 尝试链接目标文件时的'未定义的函数引用'

时间:2017-04-23 19:22:42

标签: c

所以我用

创建目标文件
cc -c MAIN.C
cc -c tablero.c

但是当我尝试用

将它们链接到可执行文件时
cc MAIN.o tablero.o

我得到了

undefined reference to `asdf()'

(在tablero.c中定义并在MAIN.C中调用的函数)

这是我的文件:

我有MAIN.C

#include <stdio.h>
#include <cstring>
#include "tablero.h"
int main()
{
   int c;
   printf( "Enter a value :");
   c = getchar( );
   putchar(c);
   printf( "\nYou entered: ");
   c = asdf ();
   putchar(c);
   return 0;
}

我有tablero.h

#ifndef TABLERO_H_
#define TABLERO_H_
int asdf();
#endif // TABLERO_H_

我有tablero.c

#include "tablero.h"
int asdf() {return 48;}; //48 is 0 in ascii

1 个答案:

答案 0 :(得分:20)

你被许多Unix系统上cc工具的一个模糊功能所困扰:后缀为小写.c的文件被编译为C,但后缀为大写的文件 .C被编译为C ++!因此,您的main(编译为C ++)包含对损坏的函数名称asdf()(又名_Z4asdfv)的外部引用,但tablero.o (编译为C)仅定义 unmangled 名称asdf

这也是您能够将C ++头文件<cstring>包含在C程序中的原因。

MAIN.C重命名为main.c(并将<cstring>更改为<string.h>),重新编译main.o,您的程序应该链接。

如果您实际上想要将部分程序编译为C而部分编译为C ++,那么您可以使用extern "C"注释头文件以使符号匹配:

#ifndef TABLERO_H_
#define TABLERO_H_

#ifdef __cplusplus
extern "C" {
#endif

int asdf(void);

#ifdef __cplusplus
}
#endif

#endif // TABLERO_H_

这样的头文件必须格外小心,只包含在C和C ++中具有相同含义的代码。只有POD类型,没有C ++关键字,没有C99但不是C ++关键字,没有重载,等等。