4

Xerces XML Parserに依存するプロジェクトをコンパイルしようとしています。このプロジェクトは問題なく Windows 用にコンパイルされますが、Cygwin で g++ を使用してコンパイルすると問題が発生します。

Xerces を使用するために、静的ライブラリに対してコードをコンパイルしようとしていますlibxerces-c.a。しかし、そうすると、次のようなエラーが表示されます。

/tmp/cc2QGvMh.o:test.cpp:(.text+0x3a): undefined reference to `xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)'

を使用してスタティック ライブラリを検査し、呼び出している関数を定義するファイルがar含まれていることを確認しました。DOMImplementationRegistry.o

ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...

また、ライブラリからオブジェクト ファイルを抽出し、'nm' を使用して、呼び出している関数が実際に存在することを確認しました。

ar -x libxerces-c.a
nm --demangle DOMImplementationRegistry.o
...
00000080 T xercesc_2_8::getDOMImplSrcVectorMutex()
00000300 T xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)
000002a0 T xercesc_2_8::DOMImplementationRegistry::addSource(xercesc_2_8::DOMImplementationSource*)
...

Windows ではすべてをコンパイルできますが、g++ ではコンパイルできないため、エラーはリンカーの順序にある​​可能性があると考えました (この質問で説明されている問題と同様)。ただし、リンカーの順序を変更した後でも、同じコンパイラ エラーが発生します。私は両方を試しました

g++ -o test.exe test.cpp -Llib -lxerces-c

g++ -o test.exe test.cpp lib/libxerces-c.a

何か案は?

4

3 に答える 3

7

あなたのプロジェクトは、コンパイラ エラー メッセージで指摘されている xercesc_2_6 名前空間のメソッドを使用していますが、ライブラリは xercesc_2_8 バージョンを提供しています。問題は、使用するヘッダーとライブラリ オブジェクト ファイルの不一致が原因である可能性があります。

于 2012-07-06T18:09:19.140 に答える
4

あなたはアーカイブの出所を言わなかった。cygwinでコンパイルされていない場合は、名前マングリングの問題である可能性があります。ソースからライブラリをコンパイルすると、これが修正される可能性があります。

また、アーカイブが正しく構築されていないため、内部解決の問題が発生している可能性もあります。ライブラリ名を2回付けてみてください。

g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a

これが機能する場合、アーカイブは壊れているので、新しいアーカイブを探すか構築する必要があります。

于 2012-07-09T00:17:42.593 に答える
1

リンカー オプション --enable-stdcall-fixup を試してください (「man ld」を参照)。名前マングリングと呼び出し規則を考慮します。

g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c
于 2012-07-12T18:14:49.120 に答える