c++:在不同链接库中定义的相同函数的运行时冲突

标签 c++ qt ubuntu g++ gsoap

我有以下问题: 对于我的 Qt 应用程序,我链接了几个共享 (.so) 库,其中一些包含 soapC.cpp 文件,这些文件是自动生成的 gSoap 源文件。 soapC.cpp 文件在不同的 .so 库中并不完全相同,但它们包含许多相同的函数,我们称它们为 foo()。

当我构建我的应用程序时,我按特定顺序链接所有这些库,比方说 lib1.so、lib2.so、lib3.so 等,编译运行顺利(我使用的是 g++ 编译器 v . 4.6).

但是,当我运行我的应用程序时,我注意到当一段代码(例如 lib3.so 中的代码)尝试调用也在 lib3.so 中定义的 foo() 时,出于某些原因,来自 lib1.so 的 foo() 是取而代之的是。这会导致麻烦和我的应用程序段错误。

我的问题是,有没有我可以传递给编译器的任何 c++/链接器选项,这会导致在我的应用程序运行时,实际上来自 lib3.so 的 foo(),从哪里调用,将是执行而不是 lib1.so 中的 foo()?我在尝试 -Bsymbolic 和 -Bsymbolic-functions 时运气不佳。

一个可能的解决方案是使用命名空间,但由于代码非常复杂,这是最后一个可能的解决方案。 如果有一个快速简便的解决方案,那就太好了。顺便提一句。我在 Ubuntu 下执行此操作,在 Windows 下,相同的代码可以完美运行并执行应有的操作...

最佳答案

我假设冲突的函数在生成的代码中?

命名空间是最简单的修复方法,您不必为每个头文件和 cpp 文件命名空间,只需将它们包装起来即可!为每个库创建一个头文件和 cpp 文件,并在每个库中#include 所有生成的头文件和源文件,并且只将包装器 cpp 编译到库中。如果重新生成文件,也将限制破损(最坏的情况是,必须向包装器添加 header 或 cpp)。

lib1.h

namespace lib1 {
#include "generated header 1.h"
#include "generated header 2.h"
#include "generated header 3.h"
}

lib1.cpp

namespace lib1 {
#include "generated source file 1.cpp"
#include "generated source file 2.cpp"
#include "generated source file 3.cpp"
}

关于c++:在不同链接库中定义的相同函数的运行时冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14810550/

相关文章:

c++ - 是否有与 register_printf_function 等效的 Microsoft Visual C++?

c++ - Qt 5 和 OS X Mavericks 问题

c++ - 在qt窗口的一小部分查看图像

python - 如何将 pip 安装到 ubuntu 容器中,同时将层保持在最低限度?

android - Meteor:即使我设置了正确的路径,当我尝试通过 Ubuntu 构建时也找不到 ANDROID_HOME

c++ - 搜索一组独特的指针

c++ - 在 MS Windows 上的 Netbeans 6.1 C++ 中设置 wxWidget?

c++ - QGraphicsItem绘图问题

ubuntu - 在嵌入式设备上的dpkg .deb之后找不到 puppet 代理

c++ - 打印完成后如何从打印机获取 Qt 信号?