c项目中的依赖管理

时间:2013-10-18 06:07:41

标签: c eclipse svn

让我先描述一下情况然后我会问我的问题。

我有一个非常通用的模块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的不同版本的情况。如何解决这个问题?

2 个答案:

答案 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