【发布时间】:2021-11-05 00:48:31
【问题描述】:
我有一个二进制 ABC.dll,它有一个 A 类,里面有虚函数。
ABC.dll
class A
{
/* variables*/
public:
virtual func1(int x, int y, int z);
/* other member functions and virtual functions*/
}
还有其他二进制文件正在创建此类的对象并使用其成员。
例如LIB.dll
A *obj = new A(/* constructor arguments*/);
以及其他使用此类的 dll。
现在我的软件有 ABC.dll、LIB.dll 和所有其他 dll,并且软件运行正常。 请注意,我上面的虚函数不会在任何其他二进制文件中的任何地方调用。
现在我需要更改虚函数的函数定义,为其添加参数化变量。
class A
{
/* variables*/
public:
virtual func1(int x, int y, int z, int newVal = 0);
/* other member functions and virtual functions*/
}
因此,在此处进行此更改后,我是否需要构建使用此 class A 的所有其他二进制文件或仅构建此二进制文件?
由于我的代码库很大,很难遍历每个项目并找到当前使用的地方。
如果我需要再次构建所有使用此class A 的 dll 并将其替换到我的软件位置,那么原因是什么。
当前问题:如果我不构建依赖项并在我的软件中替换它们,则当前正在使用此 dll 的进程正在崩溃。
如果是非虚函数,情况会一样吗?
注意:我也在那个实现这个虚函数的 dll 中进行了更改
【问题讨论】:
-
您正在更改公共 API,因此您必须重建所有内容!如果您在 dll-s 之间进行继承,那么即使添加虚函数也需要重建所有内容。
-
然而早些时候,当我没有使用任何虚拟功能时,该软件的进程并没有崩溃
-
我正在谈论的公共API(func1)目前没有在其他dll中使用。
-
虚拟与否在这种情况下并不重要。您正在添加额外的参数,因此您必须重建所有内容。默认值意味着编译器会默默地添加缺失值,函数总是需要 4 个参数。
-
但问题是我更改的函数没有在其他 dll 中的其他任何地方调用
标签: c++ visual-studio dll binary virtual-functions