c - c项目中的依赖管理

标签 c eclipse svn

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

我有一个非常通用的模块A。它由一个c 文件和一个h 文件组成。它唯一的依赖是 stdint.h 文件。

还有模块 B 使用模块 A (#include "module_A.h")。 还有另一个模块 C 也使用模块 A。 B 和 C 模块都通过 svn:externals 属性依赖于模块 A“管理”,以确保使用模块 B 或 C 的任何人也已 check out 模块 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的不同修订版。如何解决这样的问题?

最佳答案

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

关于c - c项目中的依赖管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19442715/

相关文章:

python - 避免在 cython 中对链表进行嵌套结构重新定义

eclipse - 在 eclipse 3.1.2 中创建 java 项目 - JRE 版本是否正确?

java - HashMap 条目冲突

java - 无法在我的 Eclipse 中安装任何类型的 Spring 工具

svn:查询 mergeinfo 需要 FSFS 文件系统架构的第 3 版;

c - 大小 8 的读取无效,位于 0x400886 : set_random_fill (app. c:60)

c - 如何在不删除项目的情况下查看 Linux (POSIX) 消息队列?

c - 在(空)框架中找不到“SLSIsSuppressedByScreenTime”

svn - 颠覆提交问题 : XML data was not well-formed

svn - 将主机文件添加到 docker 容器 - 从 Dockerfile