当前位置: 首页 > 网络应用技术

Linux环境编译多个C程序文件

时间:2023-03-09 10:17:06 网络应用技术

  本文中使用的项目是宇宙项目,宇宙的含义,提取代码:mku9。请下载并将其放在文档目录中。项目结构如下:

  这个项目就是这样。宙斯的意思是宙斯。他可以控制3个行星,太阳,月亮和地球旋转。

  大多数C/C ++开源项目都有数百千万的数十千万数千万的数十千万,几十千万的数十万的数十万的数十万的数十万,数十万的数十万是数十万的数十万千万或什至数千万的开源项目files。当GCC编译时,它实际上是单个文件汇编,然后链接阶段是多个文件。整个流程图如下:

  该项目的汇编命令如下:

  提示:上面的命令可以添加或显示更多汇编信息。

  上述命令,我首先编译Zeus.c文件。尽管此ZEUS.C文件取决于Sun.C,Moon.C和Earth.C的三个文件,但编译阶段不需要知道这3 C文件的存在。知道功能的定义。

  在汇编阶段,无需了解依赖函数的具体实现。

  编译完成后,执行以下命令以启动链接:

  操作如下:

  在这一点上,编译了一个多文件C项目。

  但是,当前的示例太简单了。许多项目C文件都带有功能。例如,现在有一个新的需求。当太阳转弯时,必须遵循月球。因此,我们更改其中的代码,以及以下代码:

  由于Sun.c调用MOON_ROTATE()函数,因此您需要介绍标题文件,但不要被标题文件的操作混淆。在汇编阶段,Sun.c和Moon.c仍然没有关系,它仍然是独立的汇编。

  在汇编阶段,Sun.c中的Moon_rotate()将被call 00 00 00取代,占据下部位置。

  在链接阶段,链接器将扫描月球。文件,找到函数的真实地址,然后替换它,因为该函数在.c In twip.call in twip.call,因此链接需要替换两个位置的地址。

  执行了先前的汇编命令,操作效果如下,月亮旋转了两次。

  上面的示例仍然很简单。在实际项目中,您可能会遇到一些makefiles。GCC接受多个输入文件。我以前曾说过,海湾合作委员会可以接受多个输入文件。

  现在sun.c依赖于月球功能。我们尝试编译这两个文件以查看会发生什么?

  从上图可以看出,该命令立即报告错误,因为在编译多个文件时,不能使用参数。该参数是允许GCC不链接链接。

  让我们拿走它,然后再次奔跑。

  我仍然报告一个错误。这是因为如果海湾合作委员会进入链接阶段,它将转到主函数的特定地址,主函数的地址在ZEUS.O中。Zeus.o不会传递到GCC命令行参数,因此将报告错误。

  因此,无论c/c ++项目多大,汇编阶段都是由一个文件编译的,外部变量和函数都会在单个文件中引用。在汇编阶段,这些引用只能用某些替换为占位符,例如00 00。

  只有在链接阶段,GCC才能接受多个文件作为输入。然后扫描这些输入文件,找到每个函数符号地址,然后替换。链接通常两次扫描文件。第一次找到,第二次将开始替换位置符号。

  通常是大型C/C ++项目的汇编,主要是以下内容:

  1.找不到标题文件,错误消息如下:

  以上错误是因为我删除了月球。

  如何求解标题文件的编译误差,通常没有相关的月亮。H在标题文件的搜索路径中。这次,您需要查看从GCC命令中找到哪些目录文件。

  只需添加-v参数,该命令如下:

  扩展知识:Linux环境的大多数软件都在-HELP中,学习看到-HELP和日志非常重要。Windows的大多数软件也具有-HELP,但是Microsoft的文档更全面,并且中文版本的版本的版本的Microsoft文件更全面。

  上图中的登录意味着您将在当前目录高跟鞋中搜索月球。由于这些目录没有月球。H文件,因此编译器将报告错误。

  因此,如果您的项目编译,则编译器找不到标题文件,并且您确实有一个标题文件,也就是说,标题文件的目录不在编译器搜索路径中。

  上述命令可以成功编译,因为我将Moon.H.H下放/Home/Ubuntu/Directory放置。

  有两种介绍头文件的方法。

  它仅在系统目录中,而不在当前目录中,如果找不到标题文件,则会报告错误。它将在当前目录中找到,也可以在系统目录中找到。

  2.未定义的参考,错误消息如下:

  以上错误是因为我写了Moon.o,您可以添加它。

  3,C/C ++大型项目也有许多汇编静态库,在动态库中的常见问题,下一篇文章将得到解释。

  扩展阅读:

  1.“打印标头文件的搜索路径”

  由于作者的水平有限,文章中将出现一些错误或不正确的地方,并邀请读者批评和纠正它们。如果读者有任何有价值的意见,您可以添加我微信Loken1。

  原始:https://juejin.cn/post/7103755248660906020