让我先描述一下情况,然后我会问我的问题。
我有一个非常通用的模块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/