我有以下问题: 在我的Qt应用程序中,我链接了几个共享(.so)库,其中一些包括soapC.cpp文件,这些文件是自动生成的gSoap源文件。 soapC.cpp文件在不同的.so库中并不完全相同,但它们包含许多相同的函数,我们称之为foo()。
当我构建我的应用程序时,我按照特定的顺序链接所有这些库,比如lib1.so,lib2.so,lib3.so,...等等,编译顺利运行(我正在使用g ++编译器v .4.6)。
当我运行我的应用程序时,我注意到当一段代码(例如lib3.so)尝试调用foo()时,它也在lib3.so中定义,由于某些原因,来自lib1.so的foo()是相反。这会导致麻烦和我的应用程序段错误。
我的问题是,是否有任何c ++ / linker选项可以传递给编译器,这会导致在我的应用程序运行期间从lib3.so真正的foo(),从它调用的地方,将是从lib1.so执行而不是foo()?我正在尝试-Bsymbolic和-Bsymbolic功能而没有运气。
可能的解决方案是使用命名空间,但由于代码的复杂性,这是最后一种可能的解决方案。 如果有一个快速简便的解决方案,这将是伟大的。顺便说一句。我在Ubuntu下这样做,在Windows下相同的代码完美地工作并且做它应该做的......
答案 0 :(得分:1)
我认为冲突的函数在生成的代码中?
命名空间是最容易修复的,你不必命名每个头文件和cpp文件,只需将它们包装起来!为每个库创建一个头文件和cpp文件,并在每个库中包含所有生成的头文件和源文件,并且只将包装器cpp编译到库中。如果文件被重新生成,也会限制破坏(最坏的情况是,必须在包装器中添加标头或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"
}