c - C中构建项目的问题

标签 c project-management

我正在用 C 语言做一个项目,但在构建它时遇到了问题。它是:

我的项目中有两个独立的子系统 [A 和 B],它们使用另一个子系统 [C] 的功能。为此,他们#include 必要的头文件。义务是两个子系统 [A 和 B] 都必须单独构建,我的意思是我有两个单独的子系统“Makefile”,我分别在每个子系统上运行“make”。

现在,当我尝试将我所有的子系统 [A,B,C] 合并到一个项目中时,gcc 告诉我已经声明了一些函数并且这些函数属于子系统 C。

我意识到头文件是在编译时包含的,即当我在子系统 [A 和 B] 上使用“make”时。所以,当我试图将它们全部统一起来时,它们实际上是在双重声明。

有人可以帮我解决这个问题吗?任何不需要我同时编译两个子系统 [A 和 B] 的解决方案都是好的。

最佳答案

嗯,这要么是编译错误,要么是链接器错误。

如果是编译时错误,您需要在 .h 文件中使用一些包含防护,如下所示:

#ifndef FILE_NAME_H
#define FILE_NAME_H

// file contents here

#endif

这将阻止一个文件被多次包含。更改 FILE_NAME_H 以反射(reflect)文件名,以便每个包含保护都是唯一的。

如果是链接时错误,这通常发生在头文件中有函数体(即 {})时。因为多个文件将包含 header ,每个文件在目标代码中都有自己的定义,这将导致链接器冲突。

解决此问题的最佳方法是简单地确保所有函数体都放在 .c 文件中。如果它们足够短,您可以尝试 __inline__ 它们,但不能保证编译器会听您的。

关于c - C中构建项目的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1855290/

相关文章:

c - #define vs 嵌入式环境中的枚举(它们如何编译?)

c - 为什么 write() 在输出重定向中打印在 printf() 之前?

git - 如何使用 Composer 将框架拆分成自己的组件?

project-management - 如何将团队从瀑布开发模型转变为 Scrum 模型?

project-management - 你如何开始将你的项目分解成更小的部分?

c - 如何从 C 中的 STDIN 或 Unix 管道读取流

c - 如何正确使用 select() 中的 except_set?

c - %X 表示整数的格式说明符

java - 最佳 Ivy 实践 : Split code into multiple projects or use one project with multiple configurations?

svn - 如何将文件添加到谷歌代码上的项目?