C++ 在构建不同的二进制文件时链接问题
我们的代码库有数千行代码和遗留代码。随着时间的推移,不同的开发人员按照他们的适用性和标准进行编码。错误实现的代码之一是,在不同的目录中声明并定义了一个公共头,并将其排列到不同的二进制文件中,差别很小。例: dir1/xxx.hC++ 在构建不同的二进制文件时链接问题,c++,linker,C++,Linker,我们的代码库有数千行代码和遗留代码。随着时间的推移,不同的开发人员按照他们的适用性和标准进行编码。错误实现的代码之一是,在不同的目录中声明并定义了一个公共头,并将其排列到不同的二进制文件中,差别很小。例: dir1/xxx.h class ABC{ public: int init(); }; dir1/xxx.cpp ABC::init() 同样地 dir2有自己的副本 问题是,开发人员希望保留不同的版本-主版本,因为他们应该知道何时需要调用dir1或dir2下的源代码,这与对每个版本
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都有一些编译和链接的附加接口
不幸的是,所需的头包含公共声明(定义了相同的方法,但略有不同)
我们如何解决这个问题?包括名称空间将意味着我们的代码库中有很多改进?有更好的方法吗
对于这样一个代码库,什么样的设计才是最好的——这样以后就不会有开发人员意外地包含这些致命的签名了
请提供帮助在开发人员之间共享代码有几种方法:
如果可能的话,你真的需要重新思考基本的实践,如果可以的话,撤销它。如果在所有不同的库项目中使用相同的基本头和类(或一组类),即使有微小的变化,也应该有某种方法将这些变化协调到一个适当的类层次结构中,这样一个库(根据需要带有实现稍有不同变化的子类)就可以替换多个副本