链接问题同时构建不同的二进制文件

时间:2010-08-30 12:10:41

标签: c++ linker

我们的代码库有数千行代码和遗留代码。随着时间的推移,不同的开发人员根据其适用性和标准编码。其中一个错误实现的代码是在不同的目录中声明和定义包含的公共头,以排列到不同的二进制文件,几乎没有差别。例如:

DIR1 / xxx.h

class ABC{

public:

int init();
};

DIR1 / xxx.cpp

ABC::init()

同样

dir2有自己的副本。

问题在于开发人员希望保留不同的版本 - 主要版本,因为他们应该知道何时需要在dir1或dir2下调用源代码,这与每个版本的修改无关。

现在它是我们如何在二进制文件中链接代码的层次结构是我们的问题。所涉及的头文件是使用相同的包含指令#ifndef ... #define .. #endif有条件地编译的。头文件存档到lib1.a lib2.a等等。因此,当我们链接我们的库时,如果我们在链接期间从lib3.a需要它,我们需要确保它链接第一个:

ldd .. lib1.a lib2.a lib3.a - 因此确切的标头无法正确链接。请注意,所有.a都有一些编译和链接的附加接口。

不幸的是,所需的标题包含公共声明(定义相同的方法但有点不同)

我们如何解决这个问题?包含Namespace会对我们的代码库进行大量修改吗?有没有更好的方法呢?

对于这样的代码库来说什么是最好的设计 - 以便以后开发者不会意外地包含这些致命的签名?

请帮忙

2 个答案:

答案 0 :(得分:0)

在开发人员之间共享代码有几种方法:

  1. 让每个人分享相同的代码。让团队负责共享代码,如果他们对共享代码进行了更改,请确保使用共享代码将这些更改(例如,方法的额外参数)“传播”到所有应用程序。

    或者,你可以让'everybody'对shraed代码负责,但即便如此,如果共享代码发生了变化,那么进行更改的开发人员应该将其传播给所有其他应用程序。

    在这种方法中,您仍然可以选择将共享代码分发为LIB或DLL。

  2. 为每个人提供他们自己的共享代码副本。同时,制作共享代码的“中央版本”,并将此“中央版本”设为“主干”。这意味着,无论何时需要更改共享代码,都会更改此“中央版本”。应用程序中共享代码的所有本地副本都不会更改。

    此外,将“Integration Manager”的任务分配给每个应用程序团队的成员。他/她将负责引入新版本的共享代码,从中央版本到本地副本。他/她将必须在应用程序中进行更改,以确保应用程序仍然可以使用新副本,并确保使用新的共享代码版本重新测试应用程序。

答案 1 :(得分:0)

如果可能的话,你真的需要重新考虑基本练习,如果可以的话,撤消它。如果在所有不同的库项目中使用相同的基本头和类(或类集),即使有微小的变化,也应该有一些方法将这些变体协调为适当的类层次结构,这样一个单独的库,带有子类根据需要实施稍微不同的变化,替换多个副本。