【问题标题】:I don't know how to link multiple files我不知道如何链接多个文件
【发布时间】: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


【解决方案1】:

当您有多个源文件共同构成一个可执行文件时,它们必须分别编译然后链接在一起。这是通过在调用编译器时指定每个源文件来完成的。

另请注意,您可以像以前一样一步完成编译和链接,也可以按如下方式将它们分开:

gcc -c main.c
gcc -c f.c
gcc -o f main.o f.o 

管理多个源文件及其依赖项是使用 makefile 发挥作用的地方。

【讨论】:

  • 我需要学习如何为这个用途创建简单的make文件...顺便谢谢你,这是一个非常清楚的解释
【解决方案2】:

您需要了解从 c 源代码到可运行二进制文件的三个阶段。对于 etch 和每个文件,除了头文件或 .h 文件外,必须遵循此阶段。

  1. 第一阶段:组装源。 gcc -S -o source.s source.c
  2. 第二阶段:汇编为编译二进制对象。不能直接运行。 gcc -c source.s -o source.o
  3. 第三阶段:在这个阶段,我们将所有已编译的二进制文件转换为单个已编译的二进制文件,其中输入二进制对象包含一个入口函数int main()。这是我们可以在操作系统上运行的文件。gcc -o OutputFile source1.o source2.o source3.o ......

在这三个阶段之后,我们可以通过./OutputFile 运行我们的程序。可以避免制作汇编文件,直接制作目标文件。

是的,您必须在项目中包含所有要编译的文件。您可以使用 automake 或 linux shell 脚本等自动化工具来完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多