2

おでこが傷だらけです。

静的ライブラリとして使用する大きなオープン ソースDICOMライブラリ ( ) があります。dcmtkこれはアンマネージド C++ であり、それC++ DLLをラップするマネージドからリンクしています。CMake を使用して、さまざまなプラットフォームのビルド手順を修正します。(2008 年から)への移行によりVS2010ビルドが壊れたため、使用しているライブラリのバージョンも更新する機会を得ました (より使いやすいはずですVS2010)。ライブラリをいじった後、ビルドが行われます(型変換に関する無数の警告を出したり受け取ったりします)。しかし、それを使用するコードはリンクしません。未解決の外部シンボル エラーが多数スローされます。

ライブラリに問題はありません(libファイル名を変更すると、適切なメッセージで以前に失敗します)。

ライブラリ ファイルを DUMPBIN で逆アセンブルすると、適切なトークンが表示されます。例: … 000000000000000E: C3 ret

??1OFString@@QEAA@XZ (public: __cdecl OFString::~OFString(void)):

0000000000000000: 40 53              push        rbx…

しかし、リンカはそれを見つけられません:

error LNK2001: unresolved external symbol "public: __thiscall OFString::~OFString(void)" (??1OFString@@QAE@XZ)

私はそれが__cdecl vs. __thiscall不一致であるという理論に取り組んできましたが、VSに他の規則でライブラリを構築させることができませんでした。(皮肉なことに、古い 2008 バージョンはemit __thiscall、私が考えた /Gd オプションでコンパイルされているようですforces __cdecl)。

洞察はありますか?

4

1 に答える 1

4

名前マングリングが異なることがわかります。undname.exe を使用すると、問題が解決する可能性があります。

Undecoration of :- "??1OFString@@QEAA@XZ"
is :- "public: __cdecl OFString::~OFString(void) __ptr64"

対:

Undecoration of :- "??1OFString@@QAE@XZ"
is :- "public: __thiscall OFString::~OFString(void)"

また、x64 と x86 を混在させていますか?

于 2012-09-11T16:56:48.213 に答える