【发布时间】:2021-04-29 14:23:16
【问题描述】:
我正在学习如何使用头文件,但在链接这 3 个文件时遇到了问题:
f.c:
#include "f.h"
int getfavoritenumber(void)
{
return 3;
}
f.h:
#ifndef _f_H_
#define _f_H_
int getfavoritenumber(void);
#endif
main.c:
#include <stdio.h>
#include "f.h"
int main (void)
{
printf("%d\n", getfavoritenumber());
return 0;
}
编译gcc main.c -o f我得到这个错误:
Undefined symbols for architecture x86_64:
"_getfavoritenumber", referenced from:
_main in main-7be23f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但如果我将f.c 文件包含在gcc main.c f.c -o f 中,它就可以工作。
那么,在编译时,我应该包含我在项目中使用的每个 C 文件,还是我遗漏了什么?因为将单个文件添加到gcc 非常烦人。
【问题讨论】:
-
您可能想要查找诸如
make和makefile 之类的命令。或其他项目/构建系统。这样的系统不仅会为您处理这些问题,而且可能还会为您处理系统配置和查找库之类的事情,以及处理依赖关系检查,因此您无需重新构建尚未修改的源文件。 -
您可以使用
gcc *.c编译目录中的所有.c 文件。 -
您不需要在命令行中提供每个 C 文件,除非您使用 -c 选项
gcc -c foo.c单独编译它们,然后将所有已编译的 C 对象文件链接到一个可执行文件gcc foo.o bar.o -o foobar。请注意,在没有 -c 的情况下编译时,您需要提供 main() 函数 -
@cigien 应该被接受为解决方案。
标签: c