【问题标题】:c++: run-time conflict of same functions defined in different linked librariesc ++:在不同链接库中定义的相同函数的运行时冲突
【发布时间】:2013-02-11 10:43:55
【问题描述】:

我有以下问题: 我将几个共享 (.so) 库链接到我的 Qt 应用程序,其中一些包含自动生成的 gSoap 源文件的 soapC.cpp 文件。不同 .so 库中的 soapC.cpp 文件并不完全相同,但它们包含许多相同的函数,我们称它们为 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 下,相同的代码可以完美运行并执行应有的操作...

【问题讨论】:

  • 我认为稳健的解决方法是为 gsoap 的代码生成器添加命名空间支持,或者在它已经存在时使用它。请注意,github.com/KDAB/KDSoap 支持命名空间 :)(免责声明:我为 KDAB 工作)
  • 谢谢,我知道,但正如我所说,命名空间是最后的选择,因为所有项目中的代码重构都太大了......我更多的是寻找捷径...... .

标签: c++ qt ubuntu g++ gsoap


【解决方案1】:

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

命名空间是最简单的解决方法,您不必为每个头文件和 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"
}

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 2018-04-17
    • 2015-07-12
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多