gpt4 book ai didi

C 编译 - 尝试链接目标文件时为 'undefined reference to function'

转载 作者:太空狗 更新时间:2023-10-29 16:46:33 26 4
gpt4 key购买 nike

所以我用

创建目标文件
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

最佳答案

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

这也是您能够包含 C++ 头文件的原因 <cstring>在本来应该是 C 程序的地方。

重命名 MAIN.Cmain.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-but-not-C++ 关键字,没有重载,等等。

关于C 编译 - 尝试链接目标文件时为 'undefined reference to function',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com