LNK2019が解消しません

解決


bizkit  2006-01-04 23:08:44  No: 60144

こんにちは。
以下のリンクエラーがどうしても解消できません。

--------------------------------------------------------------------------------
error LNK2019: 未解決の外部シンボル "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (?ConvertStringToBSTR@_com_util@@YGPA_WPBD@Z) が関数 "public: __thiscall _variant_t::_variant_t(char const *)" (??0_variant_t@@QAE@PBD@Z) で参照されました。
--------------------------------------------------------------------------------

コンパイラはVisual Studio .NET 2003、OSはWindows XP(SP2)を使用しています。
自作のソースコードからはConvertStringToBSTR()なるメソッドは呼んでいません。
「追加の依存ファイル」に(ConvertStringToBSTR()の実態が存在する)ライブラリcomsupp.libを定義しても駄目でした。
解決方法をご存知の方、どうかよろしくご教示願います。


PATIO  2006-01-04 23:58:34  No: 60145

COMコントロールを使ったりしてないですか?
あと、エラーの内容を見ると分かりますが、
ConvertStringToBSTRを呼んでいるのは、__thiscall _variant_t::_variant_tのようですけれど、これも見覚えは無いですか?

あと、.NET環境の場合は、Managedコードかどうかも明示した方が良いと思います。


bizkit  2006-01-05 01:53:16  No: 60146

> PATIOさん
回答ありがとうございます。
Convert... のほうにばかり気が取られてしまいましたが _variant_t は使用しています。
大変申し訳ないのですが、「COMコントロール」とか「Managedコード」とかどこを見れば判るのでしょう???
ヘルプ等参照してみましたが、vc初心者の私には難解過ぎて。。。
人の作ったプログラムの保守をしており、全貌は把握していないのですが、
XMLファイルやExcelファイルへのアクセスを行っています。何か関係あるでしょうか。


RAPT  2006-01-05 02:25:38  No: 60147

> XMLファイルやExcelファイルへのアクセスを行っています。
これを‘どうやって’実現しているか、が問題となります。

FILE *fp=fopen("hoge.xml");
とかだったら、COMじゃない。
xxx->QueryInterface(....);
とかあったら、COM使っています。

Code始まるAPI使っていたら、これもCOM。
COM=Component Object Model


bizkit  2006-01-05 03:08:31  No: 60148

ありがとうございます。
そういうことでしたらCOMを使用しています。
XMLファイルはMS-XMLを使用、EXCELファイルアクセスはEXCELのタイプライブラリをimportしてアクセスしています。
ただしコンパイラからリンクエラーを指摘されているプロジェクトからは直接アクセスはしておらず、定義しているヘッダに

static const _variant_t DEF_HOGEHOGE = "A";

という宣言文があるのみです。リンクエラーとなったプロジェクトからは一切参照していない変数です。
XMLファイルやExcelファイルに直接アクセスしているプロジェクトからも同じヘッダを定義していますが、リンクエラー等は出ません。
知識不足の上に言葉足らずで申し訳ありません。
こちらでも調査しますが、何か気づいた点あればアドバイスをしていただけたらと思います。


RAPT  2006-01-05 06:30:57  No: 60149

typoがあったので一応訂正。
> FILE *fp=fopen("hoge.xml");
FILE *fp=fopen("hoge.xml", "r");

> Code始まるAPI使っていたら、これもCOM。
Coで始まるAPI使っていたら、これもCOM。

> static const _variant_t DEF_HOGEHOGE = "A";
> という宣言文があるのみです。リンクエラーとなったプロジェクト
> からは一切参照していない変数です。
使っていないならコメントアウトしてみては?

共通ヘッダなどで手出しできないなら、使えているプロジェクトと
問題のプロジェクトとで設定が異なっていないか確認してみると
良いと思います。

蛇足。-----
> 同じヘッダを定義していますが
C/C++言語で「定義」「宣言」の言葉は慎重に使わないと混乱の元です。
そのヘッダファイルを#include しているのなら、素直に、そう書いた
方が無用の混乱を避ける事ができます。

そして
> static const _variant_t DEF_HOGEHOGE = "A";
は定義文です。(externで初期化がないなら宣言文)
-----ここまで


PATIO  2006-01-05 18:54:21  No: 60150

例え参照していなくても定義があれば、ライブラリは必要になりますよ。
その定義が必要であれば、リンクする必要があると思います。
必要ないなら定義を削るとかそのヘッダファイルのインクルードを止めるとか
する必要があると思います。


bizkit  2006-01-11 08:00:12  No: 60151

> PATIOさん
遅い正月休みのためお礼の返信が遅くなってしまいました。
大変申し訳ありません。
真の原因は把握し切れていないのですが、
とりあえず _variant_t の定義文をリンクエラーになったプロジェクトから
#include していないヘッダに移したところ、リンクが通りました。
修正前の段階で自分以外のPCではリンクは通っているので、
環境や .net の設定の問題かもしれません。
勉強も兼ねて、時間を見つけて追跡調査をしたいと思っています。
本当にありがとうございました。


Ban  2006-01-11 18:20:45  No: 60152

> 真の原因は把握し切れていないのですが、
  -- snip --
> 勉強も兼ねて、時間を見つけて追跡調査をしたいと思っています。

挙動を聞く限り、PATIO さんのご指摘がズバリ真の原因です。

定義をincludeしていれば実体が必要になるわけですが、
リンクエラーのプロジェクトにはそのライブラリなりが登録されていなかった。

おそらく、通るプロジェクトと通らないプロジェクトでは、
リンクしているライブラリが異なるのでしょう。
(#pragma comment(lib, ...)等で知らずに指定されているものも含めて)


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

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






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