Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:动态共享库中的虚函数产生错误_C++_Eclipse_Dll_Segmentation Fault_Eclipse Cdt - Fatal编程技术网

C++ C++;:动态共享库中的虚函数产生错误

C++ C++;:动态共享库中的虚函数产生错误,c++,eclipse,dll,segmentation-fault,eclipse-cdt,C++,Eclipse,Dll,Segmentation Fault,Eclipse Cdt,在我正在编写的应用程序中,我正在从我编写的共享库动态加载对象 这一点很好,虚拟功能发挥作用。这意味着我可以很容易地调用getter和setter,但是当试图调用覆盖虚拟基类函数的函数时,我会立即遇到分段错误。目前我的想法已经没有了,因为这发生在我项目中的每个类(层次结构)上 在应用程序内部创建对象时,可以成功调用这些函数,而不必使用动态加载或共享库 我怀疑这可能是一个概念上的错误,也可能是某种编译/链接错误 类层次结构如下所示: 基类.h: class基类:public-EvenMoreBase

在我正在编写的应用程序中,我正在从我编写的共享库动态加载对象

这一点很好,虚拟功能发挥作用。这意味着我可以很容易地调用getter和setter,但是当试图调用覆盖虚拟基类函数的函数时,我会立即遇到分段错误。目前我的想法已经没有了,因为这发生在我项目中的每个类(层次结构)上

在应用程序内部创建对象时,可以成功调用这些函数,而不必使用动态加载或共享库

我怀疑这可能是一个概念上的错误,也可能是某种编译/链接错误

类层次结构如下所示:

基类.h:

class基类:public-EvenMoreBaseClass{
公众:
虚拟bool注册(const shared_ptr filepath)=0;
}

h.h:

派生类:公共基类{
bool注册(常量共享文件路径);
}

派生的.cpp:

bool派生::注册(常量共享文件路径){

在构建配置中设置的项目之间,类型的大小是否会有任何差异

[更新]

我遇到过类似的问题,当一个项目定义了与另一个项目大小不同的short和long类型,并且包含这些类型的类通过相同的头文件引用时。一个项目将第二个short放在字节2,另一个项目认为它在字节4

我还遇到了不同填充值的问题。一个项目将奇数字符填充到4字节边界,另一个项目认为填充到8字节边界


虚拟函数指针可能也是如此,可能一个项目适合32位,另一个项目需要64位。

确保dll和可执行文件都是使用完全相同的编译器设置编译的。如果它们不同,编译器可能会在可执行文件中生成与e dll需要,反之亦然,这是一种违反

请注意,标准库类型(例如std::string和std::shared_ptr)在调试配置中可能具有不同的布局,并且也可以在不同的编译器版本之间更改(即使来自同一供应商)


一般来说,您需要小心跨dll边界使用类。通常建议只处理内置类型和无状态接口。

也许这是一个非常晚的答案,但我发现同样的行为,如果在访问虚拟方法之前使用
dlclose(handle)
,也会发生这种情况(尽管静态方法工作正常)。因此,在处理完库句柄中的对象之前,不应关闭库句柄。

您在调试器中运行过此操作吗?我运行过,但在尝试访问虚拟函数的第二次尝试时,我收到了一个SEGFULT。我为虚拟函数的名称设置了断点,但从未在库中成功调用它。它们包含相同的文件,我通常都是这样做的y编译这两种配置。这可能是一个问题,例如,一个版本生成的.o文件与另一个版本不同,导致库和应用程序的类型不同?或者您是指其他类型的类型?感谢更新,我将在回到问题时检查这一点,因为动态加载相当困难在这个项目中,我将首先关注应用程序逻辑。