VC6からVC2005で作成したライブラリを呼ぶには?

解決


エコ  2008-06-03 07:31:20  No: 68455

はじめまして

VC6からVC2005で作成したライブラリ(*.lib)をリンクさせ
ライブラリ内の関数のコールを行いたいのですが
リンク時に以下のエラーが発生してしまいうまくリンクさせることができません

質問させていただきたいのは
1.そもそもVC6からVC2005で作成したライブラリリンクさせ、ライブラリ内の関数をコールすることができるのか
2.1.を行えるならばそれぞれのコンパイル環境での設定をどのように変更すればよいのか
の2点です

大変お手数ですがご存じの方がいらっしゃればご教示いただけないでしょうか

【現在行っている設定】
「VC++ 6.0」
・構成はデバッグでコンパイル
・[プロパティ]−[一般]−[Microsoft Foundation Class]は[共有DLLでMFCを使用]
・[プロパティ]−[C/C++]−[コード生成]−[使用するラインタイムライブラリ]は[マルチスレッド(DLL、デバッグ)]
・[プロパティ]−[リンク]−[インプット]−[オブジェクト/ライブラリモジュール]
Nafxcwd.lib Libcmtd.lib Libcmt.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib LIBCMT.lib
・コマンドライン
/nologo /MDd /W2 /Gm /GX /ZI /Od /FR"Debug/" /Fo"Debug/" /Fd"Debug/" /FD /Ob /Zm200 /c 

「VC++ 2005」
・構成はリリースでコンパイル
・[プロパティ]−[構成プロパティ]−[全般]−[MFCの使用]は[スタティックライブラリをMFCで使用]
・[プロパティ]−[構成プロパティ]−[C/C++]−[コード生成]−[基本ランタイムチェック]は[規定値]
・[プロパティ]−[構成プロパティ]−[C/C++]−[コード生成]−[ランタイムライブラリ]は[マルチスレッド(/MT)]
・[プロパティ]−[構成プロパティ]−[C/C++]−[コード生成]−[バッファセキュリティチェック]は[いいえ]
・[プロパティ]−[構成プロパティ]−[C/C++]−[デバッグ情報の形式]は[無効]
・[プロパティ]−[構成プロパティ]−[C/C++]−[詳細]−[既存ライブラリの省略]は[いいえ]
・コマンドライン
/Od /Ob2 /I /FD /EHsc /MT /GS- /Gy /Zc:wchar_t- /Zc:forScope- /GR- /Fo".\Release/" /Fd".\Release/" /W3 /nologo /c /TP /errorReport:prompt

【上記設定でのエラーメッセージ】
*.lib(*.obj) : error LNK2001: 外部シンボル ""struct std::_DebugHeapTag_t const & __cdecl std::_DebugHeapTag_func(void)" (?_DebugHeapTag_func@std@@YAABU_DebugHeapTag_t@1@XZ)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "___CxxFrameHandler3" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "_memcpy_s" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""void __cdecl std::_Debug_message(unsigned short const *,unsigned short const *,unsigned int)" (?_Debug_message@std@@YAXPBG0I@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "_memmove_s" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__invalid_parameter" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル ""public: __thiscall std::exception::exception(char const * const &,int)" (??0exception@std@@QAE@ABQBDH@Z)" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__mktime64" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__gmtime64" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__time64" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__ftime64" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__WSAStartup@8" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__htons@4" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__inet_addr@4" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__ioctlsocket@12" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__socket@12" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__closesocket@4" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__WSAGetLastError@0" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__recv@16" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__connect@12" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__select@20" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__send@16" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__ftol2_sse" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "___WSAFDIsSet@8" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__difftime64" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__htonl@4" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__ntohs@4" は未解決です
*.lib(*.obj) : error LNK2001: 外部シンボル "__imp__sendto@24" は未解決です

【OS】
Windows  Xp  Professional


そだ  2008-06-03 10:33:10  No: 68456

Ws2_32.lib  をVC6側のプロジェクトに追加してみるとか。

少なくともソケット関連の関数のエラーは消えそう。

timeはVS2005でごにょごにょっとしてやらないといけないのかな。
http://msdn.microsoft.com/en-us/library/1f4c8f33(VS.80).aspx

VC++ 2005で作っているのってスタティックライブラリ?
だったらDLLにするだけで結構うまくいったりして。


夏みかん  2008-06-03 15:48:36  No: 68457

言語(C,C++)を合わせている?

VC2005がC言語で作られたlibなら
VC6.0でもC言語としてコンパイル。

VC2005がC++言語で作られたlibなら
VC6.0でもC++言語としてコンパイル。

とすれば未解決のエラーが消えそうな気がする。
C言語のlibをC++のソースで正しく呼び出すには
プロトタイプ宣言で
extern "C" {
  :
  C言語のプロトタイプ宣言
  :
};
とすれば良かったような。
うろ覚えです。
ちょっと自信なし。注意。


そだ  2008-06-03 22:13:04  No: 68458

ライブラリにした自作関数などに関するリンクエラーはプロトタイプ宣言で
解決できそうですね。ただ、

>*.lib(*.obj) : error LNK2001: 外部シンボル ""public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ)" は未解決です
>*.lib(*.obj) : error LNK2001: 外部シンボル ""public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z)" は未解決です
>*.lib(*.obj) : error LNK2001: 外部シンボル "___CxxFrameHandler3" は未解決です
>*.lib(*.obj) : error LNK2001: 外部シンボル ""void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z)" は未解決です
>*.lib(*.obj) : error LNK2001: 外部シンボル ""void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)" は未解決です

この辺のエラーはVC6とVC2005の持つライブラリの違いが原因な
気がします・・・

最新のPlatform SDKをダウンロードしてVC6でそれを使用するように
してみるとか、あとは

VC2005で作るライブラリプロジェクトの設定で、
MFCをダイナミックリンクで使用してみるか、

先ほど書いたようにスタティックリンクライブラリから
ダイナミックリンクライブラリにライブラリ側の
プロジェクト変えてみるとか。


エコ  2008-06-04 07:56:39  No: 68459

そださん、夏みかんさんどうもありがとうございます

最後にいただいたRESの内容はまだ確認できておりませんが
教えていただいた内容を実施したところある程度リンクエラーが消えました

残りは以下の4ブロックなのですが各ブロックについて質問させてください

【1】[プロパティ]−[リンク]−[インプット]−[無視するライブラリ]に「LIBCMT.lib」とすると競合エラーは消えますが
      他の関数が未定義になってしまいます。なにかよい回避方法はないでしょう
LIBCMT.lib(unlink.obj) : error LNK2005: _remove はすでに MSVCRTD.lib(MSVCRTD.dll) で定義されています
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter はすでに MSVCRTD.lib(MSVCRTD.dll) で定義されています
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit はすでに MSVCRTD.lib(MSVCRTD.dll) で定義されています
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit はすでに MSVCRTD.lib(MSVCRTD.dll) で定義されています
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z はすでに MSVCRTD.lib(cinitexe.obj) で定義されています
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a はすでに MSVCRTD.lib(cinitexe.obj) で定義されています
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z はすでに MSVCRTD.lib(cinitexe.obj) で定義されています
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a はすでに MSVCRTD.lib(cinitexe.obj) で定義されています
MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __setmbcp はすでに LIBCMT.lib(mbctype.obj) で定義されています

【2】最後にいただいた内容を試してみます
error LNK2001: 外部シンボル "___CxxFrameHandler3" は未解決です
error LNK2001: 外部シンボル ""void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z)" は未解決です
error LNK2001: 外部シンボル ""void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)" は未解決です
error LNK2001: 外部シンボル "_memcpy_s" は未解決です

【3】このブロックはなんだかよく理解できていません、例外処理関係の設定を変更すれば対応可能なのでしょうか
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)" は未解決です
error LNK2001: 外部シンボル "_memmove_s" は未解決です
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)" は未解決です
error LNK2001: 外部シンボル ""public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z)" は未解決です
error LNK2001: 外部シンボル ""public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ)" は未解決です
error LNK2001: 外部シンボル ""public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ)" は未解決です

【4】「VS2005でごにょごにょっと」について詳細を教えていただけないでしょうか
error LNK2001: 外部シンボル "__wassert" は未解決です
error LNK2001: 外部シンボル "__invalid_parameter_noinfo" は未解決です
error LNK2001: 外部シンボル "__mktime64" は未解決です
error LNK2001: 外部シンボル "__gmtime64" は未解決です
error LNK2001: 外部シンボル "__time64" は未解決です
error LNK2001: 外部シンボル "__ftime64" は未解決です
error LNK2001: 外部シンボル "__ftol2_sse" は未解決です
error LNK2001: 外部シンボル "__difftime64" は未解決です

※DLL化については考えてはいるのですが
  事情があってライブブラリ形態でリンクする必要があります

以上です、たびたびお手数おかけいたしますがよろしくお願いいたします。


そだ  2008-06-05 03:55:41  No: 68460

あまり力にはなれませんが・・・
【1】ぐぐったらこんなのでてきた
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200208/02080048.txt
ライブラリですがリリース用とデバック用の二つを用意して、
VC6側で別々にリンクする必要があるのではないでしょうか。

【2】,【3】は
ぐぐってざっと見た感じだとむしろ上記の使用するライブラリ
(マルチスレッド デバック/マルチスレット)の変更で解決しちゃいそう
なきもないでもないです。

time64に関しては64bitOS用の関数で、VC2005からの新しい関数なのかなぁ
と思ったのですが・・
前々回あたりにMSDNへのリンク張りましたが、リンク先にあるように
_USE_32BIT_TIME_Tの定義することで32bit版の関数を使うように
してみてはいかがでしょうか。


エコ  2008-06-09 06:50:37  No: 68461

いろいろ試してみましたが競合が外れないので
DLLで対応することを検討しようと思います

いろいろ御助言いただきましたが
Lib化については結果がだせず申し訳ありません


そだ  2008-06-09 11:23:37  No: 68462

DLLで対応してもデバックバージョン、リリースバージョンは
わけないとトラブルになりそうなのでお気をつけて。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加