2

Visual Studio 8.0 SP2を使用してlibファイルにコンパイルする非常に単純なプログラム(「何かを与えて、何かを得る」という単純な計算)があります。

この lib ファイルは、別のプログラムにリンクされます。問題は、他のプログラムが Visual Studio 6.0 を搭載したコンピューター上にあることです。

プログラムをコンパイルして lib ファイルにリンクすると (VS 6.0 を使用)、次のエラーと警告が発生します。

最初のいくつかの警告:

    Linking...
myLib.lib(SeController.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored
myLib.lib(SeController.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored
myLib.lib(SeController.o) : warning LNK4044: unrecognized option "alternatename:??$get_name@Vinvalid_argument@std@@@Exception@Impl@Core@@YAPBDXZ=?get_name@Exception@Impl@Core@@YAPBDXZ"; ignored
myLib.lib(SeController.o) : warning LNK4078: multiple ".CRT" sections found with different attributes (40300040)
myLib.lib(bt_errors.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored
myLib.lib(bt_errors.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored
myLib.lib(SCtrlImpl.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored
myLib.lib(SCtrlImpl.o) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored

.... (ここでの警告の一部です。同じタイプの Hunders があります)

次に(一部の)エラー:

msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char
 const *)" (??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in libcpd.lib(locale0.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: virtual __thiscall std::basic_ostream<char,struct std::char_traits<char> >::~basic_ostream<char,struct std::char_traits<char> >(void)" (??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ) alread
y defined in libcpd.lib(iostream.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: virtual __thiscall std::basic_ios<char,struct std::char_traits<char> >::~basic_ios<char,struct std::char_traits<char> >(void)" (??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in
 libcpd.lib(iostream.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: virtual __thiscall std::basic_istream<char,struct std::char_traits<char> >::~basic_istream<char,struct std::char_traits<char> >(void)" (??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ) alread
y defined in libcpd.lib(iostream.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: __thiscall std::basic_istream<char,struct std::char_traits<char> >::basic_istream<char,struct std::char_traits<char> >(class std::basic_streambuf<char,struct std::char_traits<char> > *,bool)" (??0?$
basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z) already defined in libcpd.lib(iostream.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "public: virtual __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::~basic_streambuf<char,struct std::char_traits<char> >(void)" (??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ) 
already defined in libcpd.lib(iostream.obj)
msvcprt.lib(MSVCP60.dll) : error LNK2005: "protected: __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::basic_streambuf<char,struct std::char_traits<char> >(void)" (??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@XZ) alread
y defined in libcpd.lib(iostream.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _vsprintf already defined in libcd.lib(vsprintf.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _exit already defined in libcd.lib(crt0dat.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in libcd.lib(atox.obj)

VS 8.0 用の Visual Studio 2005 Redistrubate パッケージを 6.0 のコンピュータにダウンロードしようとしましたが、同じエラーと警告が表示されました。

8.0 の lib ファイルを 6.0 コンパイラでリンクすることは可能ですか?

インストールされているバージョンを変更するオプションではありません。(そして、なぜ誰かがVS 6.0を使用しているのかを尋ねないでください:))

4

2 に答える 2

1

アプリケーションを別の C ランタイム、つまり VS 6.0 とリンクできますが、両方のバージョンを同じマシンにインストールする必要があると思います。あなたが別のマシンについて話していることは理解したので、それは選択肢ではないと思います。

単純な C API を使用して動的ライブラリを作成できれば、作業がずっと簡単になります:) VS のどのバージョンからでもそのような DLL を使用できます。

于 2013-01-24T12:29:03.277 に答える
0

このテキスト ( Interoperability of Libraries Created by Different Compiler Brandsから引用) を信じるなら、いいえ、できません -

異なるコンパイラで作成されたオブジェクト ファイルと静的ライブラリ、または同じコンパイラの大幅に異なるリリースで作成されたオブジェクト ファイルとスタティック ライブラリは、しばしば一緒にリンクできません。この問題は MinGW に固有のものではありません。他の多くのコンパイラは相互に互換性がありません。可能であれば、同じバージョンの同じコンパイラを使用してソースからすべてをビルドします。

DLL は少し異なります。あるコンパイラでビルドされた DLL を、別のコンパイラでコンパイルされたアプリケーションにリンクできる場合があります。これは、アプリケーションが C++ で記述されている場合でも、DLL が C で記述されている場合にうまく機能します。たとえば、MinGW C++ プログラムは、通常、Windows で提供される C ランタイム ライブラリにリンクします。C++ で記述された DLL も、extern "C" で宣言された C インターフェイスを介してのみ通信する限り、機能します。そうしないと、コンパイラが異なれば C++ 名のマングルが異なるため、リンカー エラーが発生する可能性があります。

于 2013-01-24T13:26:02.627 に答える