所以我用
创建目标文件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
答案 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 ++关键字,没有重载,等等。