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

C++ 在构建不同的二进制文件时链接问题,c++,linker,C++,Linker,我们的代码库有数千行代码和遗留代码。随着时间的推移,不同的开发人员按照他们的适用性和标准进行编码。错误实现的代码之一是,在不同的目录中声明并定义了一个公共头,并将其排列到不同的二进制文件中,差别很小。例: dir1/xxx.h class ABC{ public: int init(); }; dir1/xxx.cpp ABC::init() 同样地 dir2有自己的副本 问题是,开发人员希望保留不同的版本-主版本,因为他们应该知道何时需要调用dir1或dir2下的源代码,这与对每个版本

我们的代码库有数千行代码和遗留代码。随着时间的推移,不同的开发人员按照他们的适用性和标准进行编码。错误实现的代码之一是,在不同的目录中声明并定义了一个公共头,并将其排列到不同的二进制文件中,差别很小。例:

dir1/xxx.h

class ABC{

public:

int init();
};
dir1/xxx.cpp

ABC::init()
同样地

dir2有自己的副本

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

现在我们的问题是如何在二进制文件中链接代码的层次结构。关注的头文件是使用相同的inclusive指令#ifndef有条件地编译的#定义#恩迪夫。头文件被归档到lib1.a lib2.a中,依此类推。因此,当我们链接我们的库时,如果我们在链接过程中需要lib3.a,我们需要确保它链接了第一个:

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

不幸的是,所需的头包含公共声明(定义了相同的方法,但略有不同)

我们如何解决这个问题?包括名称空间将意味着我们的代码库中有很多改进?有更好的方法吗

对于这样一个代码库,什么样的设计才是最好的——这样以后就不会有开发人员意外地包含这些致命的签名了


请提供帮助

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

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

    或者,您可以让“每个人”对shraed代码负责,但即使如此,如果共享代码发生更改,进行更改的开发人员也应该将其传播到所有其他应用程序

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

  • 为每个人提供他们自己的共享代码副本。同时,创建共享代码的“中心版本”,并将此“中心版本”设置为“主干”。这意味着,每当需要更改共享代码时,都会更改此“中心版本”。不会更改应用程序中共享代码的所有本地副本

    此外,分配“集成管理器”的任务“发给每个应用程序团队的成员。他/她将负责引入共享代码的新版本,从中心版本到本地版本。他/她必须在应用程序中进行更改,以确保应用程序仍然与新副本一起工作,并确保应用程序使用新的共享代码版本重新测试


  • 如果可能的话,你真的需要重新思考基本的实践,如果可以的话,撤销它。如果在所有不同的库项目中使用相同的基本头和类(或一组类),即使有微小的变化,也应该有某种方法将这些变化协调到一个适当的类层次结构中,这样一个库(根据需要带有实现稍有不同变化的子类)就可以替换多个副本