• ベストアンサー

コンパイルはできるが、リンクエラーがでます。

WritePwrScheme()を使ったプロセスを作ろうとしています。コンパイルは問題ないのですがリンク時にその関数が未解決のシンボルとして表示されます。これってpowrprof.libが悪いのでしょうか?それともpowrprof.dll? そうだとしたらどこで入手できるのでしょうか? お分かりの方、回答をお待ちしております。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.6

ちょっと間違い。 ヘッダ"が"じゃなくてヘッダ"も"ね。

sakaige32
質問者

お礼

extern "C" { #include <powrprof.h> } でリンクエラーが出なくなりました。 悩んでた関数たちは、C++ではなくCとしてコンパイルしてやらないと、いけなかったのですね。 ここまで一緒に悩んでいただきありがとうございました。

sakaige32
質問者

補足

>最新のSDKでどうなってるんだろう? Microsoft Platform SDK for Windows XP SP2 を落として その中の「powrprof.h」と「powrprof.lib」を使いました 関数の宣言は以下のとおりでした。 BOOLEAN WINAPI WritePwrScheme(PUINT, LPTSTR, LPTSTR, PPOWER_POLICY); 改めてVC++6とVC++7でビルドを試みましたが VC++6では error LNK2001: 外部シンボル ""unsigned char __stdcall CanUserWritePwrScheme(void)" (?CanUserWritePwrScheme@@YGEXZ)" は未解決です error LNK2001: 外部シンボル ""unsigned char __stdcall WritePwrScheme(unsigned int *,char *,char *,struct _POWER_POLICY *)" (?WritePwrScheme@@YGEPAIPAD1PAU_POWER_POLICY@@@Z)" は未解決です VC++7では error LNK2019: 未解決の外部シンボル "unsigned char __stdcall WritePwrScheme(unsigned int *,char *,char *,struct _POWER_POLICY *)" (?WritePwrScheme@@YGEPAIPAD1PAU_POWER_POLICY@@@Z) が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル "unsigned char __stdcall CanUserWritePwrScheme(void)" (?CanUserWritePwrScheme@@YGEXZ) が関数 _WinMain@16 で参照されました。 のようにリンクエラーが発生しました。 CanUserWritePwrScheme()だけでリビルドしても、同一リンクエラーが発生しました。 どうしたらよいのでしょう?是非アドバイスをよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

もしかしたらヘッダが怪しいかも。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/power/base/writepwrscheme.asp を見ると LPTSTRじゃなくてLPWSTRになってますね。 実際にWin2000SP4のpowrprof.dllのエクスポートされた関数をDependency Walkerで見てもANSI版とUNICODE版の両方がエクスポートされているようには見えませんね。なんでUNICODEにしか対応していないのかも。 LINKのエラーの内容を見ると、ANSI版とUNICODE版があるAPIなら関数名はただのマクロの定義なので、通常本当に呼ばれる名前(API名の後ろにAやWがついてる)でエラーが表示されるはずですがWritePwrSchemeとそのまま表示されてますよね。 つまり、UNICODEビルドしてないということなので、プログラム中では引数はLPSTRで渡してることになる。 ヘッダもLPTSTRと宣言されているからコンパイルは通る。 ただし、libにはLPWSTRの関数のエクスポート情報しかないからリンクエラーになる。 ってことなのかも。 最新のSDKでどうなってるんだろう?

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

まず、 BOOLEAN WINAPI WritePwrScheme(PUINT, LPTSTR, LPTSTR, PPOWER_POLICY); ですよね。 >これは、従来は unsigned short として処理されていた wchar_t が、 >/Zc:wchar_t というコンパイラオプションによって、 >wchar_t 自体がネイティブな型として処理されるために起こるそうです。 ってことはUNICODEビルドしてるんですか? なんか、開発環境もイレギュラーで、どんな状態でビルドをしてるかも情報が小出しにしか出てこず、思い込みも強そうなので最初から1つずつ確認していくことをお勧めします。 1.VC++2002でならビルドできるか? #一緒にインストールしてあるんでしたら確認できますよね? 2.powrprof.dllに含まれる別のAPI(例えばCanUserWritePwrScheme()とか。これなら引数は絶対に問題になりませんよね)をとりあえず呼んでみてVC++6でビルドができるか? 3.WinMainやmainだけのプロジェクトを新たに作り、そこからWritePwrSchemeを呼んでビルドできるか? 4.3.の状態でWritePwrSchemeではなくCanUserWritePwrSchemeとかを呼んでみてビルドできるか? と、ここらへんまでやってみて初めてpowrprof.libや互換性に問題があるのかないのか判断しないと。 別に判断のためなんでビルドできたexeを動かす必要ないんですから。 で、個人的にはVC++6から他のコンパイラに付属のヘッダやlibを参照させるのは気持ち悪いです。最新のSDKをダウンロードして使います。

sakaige32
質問者

補足

>ってことはUNICODEビルドしてるんですか? いいえ、UNICODEは使用してません。 >なんか、開発環境もイレギュラーで、どんな状態でビルドをしてるかも情報が小出しにしか出てこず、 >思い込みも強そうなので最初から1つずつ確認していくことをお勧めします。 はい、そうさせてもらいます。 >1.VC++2002でならビルドできるか? >#一緒にインストールしてあるんでしたら確認できますよね? 以下のリンクエラーが出ました。 error LNK2019: 未解決の外部シンボル "unsigned char __stdcall WritePwrScheme(unsigned int *,char *,char *,struct _POWER_POLICY *)" (?WritePwrScheme@@YGEPAIPAD1PAU_POWER_POLICY@@@Z) が関数 _WinMain@16 で参照されました。 上記はVC6++とはエラーコード(以下に示します)が違いました。 error LNK2001: 外部シンボル ""unsigned char __stdcall WritePwrScheme(unsigned int *,char *,char *,struct _POWER_POLICY *)" (?WritePwrScheme@@YGEPAIPAD1PAU_POWER_POLICY@@@Z)" は未解決です >2.powrprof.dllに含まれる別のAPI(例えばCanUserWritePwrScheme()とか。これなら引数は絶対に問題になりませんよね)を >とりあえず呼んでみてVC++6でビルドができるか? VC++6では error LNK2001 が VC++7では error LNK2019 が起こりました。 >3.WinMainやmainだけのプロジェクトを新たに作り、そこからWritePwrSchemeを呼んでビルドできるか? error LNK2019 が起こりました。 >4.3.の状態でWritePwrSchemeではなくCanUserWritePwrSchemeとかを呼んでみてビルドできるか? VC++6では WritePwrScheme(),CanUserWritePwrScheme() ともに error LNK2001 が VC++7では WritePwrScheme(),CanUserWritePwrScheme() ともに error LNK2019 が起こりました。 私の使用している powrprof.h,dll,lib が正常じゃないみたいですね。 ネットから落とせるのなら落として再度試してみます。 こんなお馬鹿な私に適切なアドバイスをいただきありがとうございました。

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>>本当にVC6++だけですか? >.netも入ってます。 >>新しめのSDK入れなきゃHDDに存在していないと思うんですけど。 >>入れてるんでしたらVC++の環境設定してます? >ディレクトリ設定のことおっしゃっているのでしたら設定しています。 設定しているということでしたら、libファイルとヘッダファイルはどこのディレクトリにあるのを参照させているんですか? >こんなのを見つけました。解決法はわかりませんが、VC6と7の互換性に原因があることはわかりました。 ATL使ってるんですか?APIのリンクエラーとは全然関係ないと思いますけど。

sakaige32
質問者

補足

>設定しているということでしたら、libファイルとヘッダファイルはどこのディレクトリにあるのを参照させているんですか? C:\Program Files\Microsoft Visual Studio\VC98\Include C:\Program Files\Microsoft Visual Studio\VC98\ATL\Include C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include C:\Program Files\Microsoft Visual Studio .NET\Vc7\include C:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include C:\Program Files\Microsoft Visual Studio\VC98\Lib C:\Program Files\Microsoft Visual Studio\VC98\MFC\Lib C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib C:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\lib です。 >ATL使ってるんですか?APIのリンクエラーとは全然関係ないと思いますけど。 前回紹介したページの中で以下の部分が該当していると考えています  LNK2001 未解決の外部シンボルエラー  静的ライブラリや DLL で、wchar_t 型をとる関数を呼び出すときに LNK2001 未解決の外部シンボルエラーが発生する場合があるそうです。  なお、BSTR や LPWSTR という型も wchar_t* に解決されるそうで、これもこのトラブルの要因となるようです。    これは、従来は unsigned short として処理されていた wchar_t が、/Zc:wchar_t というコンパイラオプションによって、wchar_t 自体がネイティブな型として処理されるために起こるそうです。  新規の MFC プロジェクトではこのオプションが既定で ON となるそうで、このオプションが ON でなかったころに作成したライブラリと、ON のプロジェクトとが共存した場合、関数シグネチュアが一致しなくなるそうです。 これって要するに関数の型宣言が一致してないのでエラーになるのかなーって、考えてます。間違いでしょうか? いったいどうしたら良いのか・・・ 良きアドバイスを是非お願いします。

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>>Powrprof.libがリンク対象になってないだけなのでは? > >「プロジェクト/設定」ダイアログ のリンクタブで、設定してますけど・・・ なら、存在します?Powrprof.lib。 >>ビルド環境はなに? >VisualC++6.0です 本当にVC6++だけですか? 新しめのSDK入れなきゃHDDに存在していないと思うんですけど。 入れてるんでしたらVC++の環境設定してます?

sakaige32
質問者

補足

>本当にVC6++だけですか? .netも入ってます。 >新しめのSDK入れなきゃHDDに存在していないと思うんですけど。 >入れてるんでしたらVC++の環境設定してます? ディレクトリ設定のことおっしゃっているのでしたら設定しています。 こんなのを見つけました。解決法はわかりませんが、VC6と7の互換性に原因があることはわかりました。 もし私の解釈に間違いがあればご指摘頂けるとありがたいです。解決方法もお分かりでしたら教えてくださるとなお、ありがたいです。とにかく、私ごときの質問に回答いただきありがとうございます。 http://program.station.ez-net.jp/special/vc/general/conpatible.asp

すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

Powrprof.libがリンク対象になってないだけなのでは? ビルド環境はなに?

sakaige32
質問者

補足

>ビルド環境はなに? VisualC++6.0です >Powrprof.libがリンク対象になってないだけなのでは? 「プロジェクト/設定」ダイアログ のリンクタブで、設定してますけど・・・

すると、全ての回答が全文表示されます。

関連するQ&A