让我先描述一下情况然后我会问我的问题。
我有一个非常通用的模块A.它由一个c和一个h文件组成。它唯一的依赖是stdint.h文件。
还有模块B使用模块A(#include“module_A.h”)。 还有另一个模块C也使用模块A. B和C模块都通过svn:externals属性依赖于模块A“托管”,以确保使用模块B或C的任何人也检出模块A.
模块B和C彼此非常无关。 在某个项目的开发过程中,需要模块B和C。 Svn:在项目中设置了externals属性,以将这些模块放入项目目录中。 现在我们在项目目录结构中有类似的东西:
src/module_B/module_B.c
src/module_B/module_B.h
src/module_B/module_A/module_A.c
src/module_B/module_A/module_A.h
src/module_C/module_C.c
src/module_C/module_C.h
src/module_C/module_A/module_A.c
src/module_C/module_A/module_A.h
编译器检测到重复的函数定义,并停止编译错误。
我们使用Eclipse进行开发。
问题1.如何解决这个问题?问题2.如果我们深入研究这个主题,我们可能会想到模块A有几个版本,模块B和C指向模块A的不同版本的情况。如何解决这个问题?
答案 0 :(得分:0)
编译器检测到重复的函数定义,并停止编译错误。
由于编程错误,这些错误总是会出现。使用标题保护,永远不会在H文件中分配任何对象。
如果我们深入研究这个主题,我们可能会想到模块A有几个版本,模块B和C指向模块A的不同版本的情况。如何解决这个问题?
这个场景没有任何意义。有两种情况:
如果它们都依赖于A并且只存在于同一个项目中,则每次更新A时都必须更新B和C.
否则,如果它们存在于多个项目中,那么为了使这个讨论有意义,必须有一个“全局”存储库,它不是特定于项目的,您可以在其中存储每个文件的最新版本。即您要在多个项目中重复使用的文件集合。在这个回购中,所有文件都应该是最新的。
让我们说你更新A和C,但由于某些原因不是B.这只能意味着B是项目特定的 - 否则你必须与A一起更新它。如果它是项目 - 特定的,然后它不属于“全局”仓库,而是属于项目特定的仓库。并且将所有内容排序,因为在您的项目特定回购中,您可以保留旧版本的A。
答案 1 :(得分:0)
<强> Q1:强>
如果同一功能有多个定义,您的链接器会发疯。 您需要确保项目中只有1个版本的A:
src/module_A/module_A.c
src/module_A/module_A.h
src/module_B/module_B.c
src/module_B/module_B.h
src/module_C/module_C.c
src/module_C/module_C.h
<强> Q2:强>
使这项工作的唯一方法是升级B和C以与A的相同版本兼容。
A的头文件应该有版本号信息,这表示版本兼容性:
// Version 1.2
#define MODULE_A_VER_MAJOR 1 /* For backwards incompatible changes */
#define MODULE_A_VER_MINOR 2 /* For bug fixes */
然后,您可以将编译时间检查添加到模块B和C,以确保不会使用错误的A版本意外编译它们。
#include "module_A.h"
// Require at least 1.1
#if MODULE_A_VER_MAJOR != 1 || MODULE_A_VER_MINOR < 1
#error Invalid A version!
#endif