1

次の問題があります: Qt アプリケーションにいくつかの共有 (.so) ライブラリをリンクしていますが、それらのライブラリの一部には、自動生成された gSoap ソース ファイルである soapC.cpp ファイルが含まれています。soapC.cpp ファイルは、さまざまな .so ライブラリでまったく同じではありませんが、同じ関数が多数含まれています。それらを foo() と呼びましょう。

アプリケーションをビルドするとき、これらすべてのライブラリを特定の順序でリンクします。たとえば、lib1.so、lib2.so、lib3.so などとします。コンパイルはスムーズに実行されます (g++ コンパイラ v. 4.6 を使用しています)。 .

しかし、アプリケーションを実行すると、lib3.so などのコードが lib3.so で定義されている foo() を呼び出そうとすると、何らかの理由で lib1.so の foo() が代わりに呼び出されることに気付きました。これにより、問題が発生し、アプリケーションのセグメンテーション違反が発生します。

私の質問は、コンパイラに渡すことができる c++/linker オプションがあるかどうかです。これにより、アプリケーションの実行時に、lib3.so から実際に foo() が呼び出され、実行され、実行されなくなります。 lib1.so からの foo() ? 私は -Bsymbolic と -Bsymbolic-functions を試していましたが、うまくいきませんでした。

これに対する可能な解決策は名前空間を使用することですが、コードが非常に複雑であるため、これはむしろ最後の可能な解決策です。これに対する迅速かつ簡単な解決策があれば、それは素晴らしいことです。ところで。私はUbuntuでこれを行っていますが、Windowsでは同じコードが完全に機能し、本来あるべきことを行います...

4

1 に答える 1

1

競合する関数は生成されたコードにあると思いますか?

名前空間は最も簡単な修正方法です。ヘッダーと cpp ファイルごとに名前空間を設定する必要はありません。それらをラップするだけです。ライブラリごとに 1 つのヘッダーと cpp ファイルを作成し、生成されたすべてのヘッダーとソース ファイルをそれぞれに #include し、ラッパー 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"
}
于 2013-02-22T19:02:00.537 に答える