1

いくつかのレガシーのサードパーティライブラリに対してアプリケーションを構築していて、リンク段階で問題が発生しています。VisualStudio9でコンパイルしようとしています。コンパイルコマンドは次のとおりです。

cl -DNT40 -DPOMDLL -DCRTAPI1=_cdecl
-DCRTAPI2=cdecl -D_WIN32 -DWIN32 -DWIN32_LEAN_AND_MEAN -DWNT -DBYPASS_FLEX -D_INTEL=1 -DIPLIB=none -I. -I"D:\src\include" -I"C:\Program Files\Microsoft Visual Studio
9.0\VC\include" -c -nologo -EHsc -W1 -Ox -Oy- -MD mymain.c

コードはきれいにコンパイルされます。linkコマンドは次のとおりです。

link -debug -nologo -machine:IX86
-verbose:lib -subsystem:console mymain.obj wsock32.lib advapi32.lib
msvcrt.lib oldnames.lib kernel32.lib
winmm.lib [snip large list of
dependencies] D:\src\lib\app_main.obj
-out:mymain.exe

私が得ているエラーは次のとおりです。

app_main.obj : error LNK2019:
unresolved external symbol
"_\_declspec(dllimport) public: void
__thiscall std::locale::facet::_Register(void)"
(__imp_?_Register@facet@locale@std@@QAEXXZ)
referenced in function "class
std::ctype<char> const & __cdecl
std::use_facet<class std::ctype<char>
(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z)

app_main.obj : error LNK2019:
unresolved external symbol
"__declspec(dllimport)  public: static
unsigned int __cdecl
std::ctype<char>::_Getcat(class
std::locale::facet const * *)"
(__imp_?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z)
referenced in function "class
std::ctype<char> const & __cdecl
std::use_facet<class std::ctype<char>
(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z)

app_main.obj : error LNK2019:
unresolved external symbol
"__declspec(dllimport)  public: static
unsigned int __cdecl
std::ctype<unsigned
short>::_Getcat(class
std::locale::facet const * *)"
(__imp_?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z)
referenced in function "class
std::ctype<unsigned short> const &
__cdecl std::use_facet<class std::ctype<unsigned short> >(class
std::locale const &)"
(??$use_facet@V?$ctype@G@std@@@std@@YAABV?$ctype@G@0@ABVlocale@0@@Z)

mymain.exe : fatal error LNK1120: 3
unresolved externals

これらのエラーは、私のコードではなく、レガシーコードから発生していることに注意してください。app_main.objはレガシーコードの一部であり、mymain.cは私のソースです。私はいくつかの検索を行いました、そして私が読んだことは、このタイプのエラーは私のコードと私がリンクしているライブラリの間の-MDスイッチとの不一致によって引き起こされると言います。私はレガシーコードを扱っているので、解決策は私の環境から来なければなりません。C ++の作業を行ってから長い時間が経ち、Visual Studioを使用してからさらに長い時間が経過したので、これが私の側の単なる無知であることを願っています。これらを解決する方法について何かアイデアはありますか?

4

4 に答える 4

4

これらは標準ライブラリのリファレンスです。すべてのライブラリ(標準ライブラリを含む)が同じリンケージを使用していることを確認してください。たとえば、標準ライブラリを動的にリンクしている間は、静的にリンクすることはできません。使用するスレッドモデルについても同じことが言えます。あなたとサードパーティのライブラリが同じリンケージオプションを使用するように特に注意してください。

これは、*ssの本当の苦痛になる可能性があります。

于 2008-08-22T19:06:53.623 に答える
2

MSDNでこれを確認してください:

  • /MD アプリケーションで、ランタイム ライブラリのマルチスレッドおよび DLL 固有のバージョンを使用します。
  • /MT アプリケーションでランタイム ライブラリのマルチスレッドの静的バージョンを使用します。

注:「...リンカーがLIBCMT.libを使用して外部シンボルを解決するように」

そのため、別のライブラリ セットが必要になります。

リンクするライブラリを見つける方法:

  1. リンクする構成を見つけて、/verbose オプションを追加します。
  2. 出力をテキスト ファイルにパイプします。
  3. リンクしない構成を試してください。
  4. ステップ 2 の詳細な出力で未解決のシンボル (「_declspec(dllimport) public: void thiscall std::locale::facet::Register(void)」の場合) を調べ、使用されているライブラリを見つけます。
  5. これらのライブラリを、リンク先のライブラリのリストに追加します。

古い学校ですが、私にとってはうまくいきました。

1月

于 2008-08-25T15:18:38.140 に答える
2

VS2008 を使用して (または将来的に) コンパイルするプロジェクトを取得したい場合は、バイナリ エディターを使用して、問題のオブジェクト ファイルmainapp.objを表示することをお勧めします。

これは私の小さなプロジェクトの例です。

zdbException.obj には、次の抜粋が含まれています

DEFAULTLIB:"libc
pmtd" /DEFAULTLI
B:"uuid.lib" /DE
FAULTLIB:"uuid.l
ib" /include:?id
@?$num_put@DV?$o
streambuf_iterat
or@DU?$char_trai
ts@D@std@@@std@@
@std@@2V0locale@
2@A /include:?id
@?$numpunct@D@st
d@@2V0locale@2@A
 /DEFAULTLIB:"LI
BCMTD" /DEFAULTL
IB:"OLDNAMES" /E
DITANDCONTINUE 

エントリ/DEFAULTLIB:"LIBCMTD"に注意してください。これは、オブジェクト ファイルがスタティック C ランタイム マルチスレッド デバッグでコンパイルされたことを示します。

obj で参照されている関数が、VS2008 に同梱されている標準のランタイム ライブラリで非推奨になっている可能性もあります。

于 2008-09-04T22:07:21.743 に答える
-2

このようなものを VS 2008 でコンパイルしようとした後、以前のバージョンの VS を試してみました。リンケージを再確認しましたが、問題が見つからなかったので、見つからなかったか、それが問題ではなかったかのどちらかです。

繰り返しますが、VS 2003 にダウングレードすると修正されました。

于 2008-08-25T15:02:24.777 に答える