• ベストアンサー

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

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

  • error LNK2001: 外部シンボル "_main" は未解決です

    VisualC++6.0で、新規作成→win32 Dinamic-Link Libraryでプロジェクト を作成し、dllファイルを作っています。 今までは、上手くコンパイル出来て、dllを作れていました。 友人の作ったライブラリにリンクして、ソースファイルで そのライブラリの関数を使って、コンパイルすると、 LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。 というエラーが出て困っています。 今、プロジェクトの設定→リンク→アウトプットの エントリポイントシンボルはDllEntryPoint@12となっています。 どうしたら良いでしょうか? どなたかご教授くださると助かります。 ちなみに、ライブラリの関数をコメントにすると、コンパイル出来ます。

  •  OpenCV2.1.0でのコンパイルエラーについて、質問があります。

     OpenCV2.1.0でのコンパイルエラーについて、質問があります。  初心者で至らない点があるかと思いますが、ぜひ回答よろしくお願いします。  動画キャプチャを再生するプログラムを作ろうと、DirectXを利用しています。  (Visual C++ 2010 expressを使っています)  インクルードファイルでの<cv.h>や<dshow.h>は、Microsofot windows SDK 6.1  やOpenCv2.1.0をインストールして、VC++ディレクトリ中の   インクルードファイル(*.h)は    c:\OpenCV2.1\include\opencv   ラ イブラリファイル(*.lib)は    c:\OpenCV2.1\lib   ダイナミックリンクライブラリ ファイル(*.dll)は    c:\OpenCV2.1\bin  (これは、”実行可能なファイル"のところへ)  設定して、コンパイルエラーは出ないようになりました。  しかし、   「インクルードファイル(*.h)は  c:\OpenCV2.1\include\opencv」  の処置のおかげで、同一フォルダに入っている   「cxtypes.h」と「cxoperations.hpp」の二つで、下記のようなコンパイルエラーが出ます。   エラーメッセージ > error C3862: /clr:pure または /clr:safe を伴うアンマネージ関数を   コンパイルできません  インラインのネイティブ アセンブリはマネージ コードで   サポートされていません >error C3645: : __clrcall は、ネイティブ コードにコンパイルされた関数  では使用できません  上のエラーから、clrの問題と考えて、.NET .Freamework 4.0(x68)を  新しくインストールしましたが、上のエラーが解決せず、コンパイルできません。  VC++ディレクトリ中のリンカーは、     strmiids.lib     cv.lib     cxcore.lib     highgui.lib     dxerr.lib     dxguid.lib     d3dx9.lib     d3dx10.lib     d3d9.lib     winmm.lib     comctl32.lib     strmbase.lib  にしました。  コンパイルエラーを解決する方法をご教示くださると、大変幸いです。  よろしくお願いします。

  • DLL呼び出しAPのリンクエラーについて

    DLL作成初心者です。 当方で簡単なDLLを作成しました。 試しに、下記の呼び出しAP(EXE)を作成しようと したのですが、リンクエラーになります。 どうしてでしょうか? 呼び出しAP #include <windows.h> int main(){ static HINSTANCE hDLL; hDLL = LoadLibrary(TEXT("DLL_TEST.DLL")); if (hDLL) FreeLibrary(hDLL); return 0; } リンクエラーは下記 IBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Debug/TEST.exe : fatal error LNK1120: 外部参照 1 が未解決です また上記"_WinMain@16"のライブラリーをリンクさせると SCRNSAVE.LIB(scrnsave.obj) : error LNK2005: _main はすでに test.obj で定義されています SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverConfigureDialog@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_RegisterDialogClasses@4" は未解決です Debug/TEST.exe : fatal error 等のエラーになります。 解決策を教えてください。

  • DirectX8でコンパイルエラー

    DirectX8実践プログラミングという本についてくるサンプルプログラムを コンパイルしようとしているのですが、 sprite.obj : error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です sprite.obj : error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileA@12" は未解決です sprite.obj : error LNK2001: 外部シンボル "_Direct3DCreate8@4" は未解決です .\Debug/spriteanimate.exe : fatal error LNK1120: 外部参照 3 が未解決です。 link.exe の実行エラー となってしまいます。DirectXを使っての勉強をはじめたばかりなのですが いきなりつまってしまいました。 おそらくライブラリが見つからないのかと思うのですが ライブラリのディレクトリ設定でC:\mssdk\libも追加されていました。 DirectX8SDKについてくるサンプルはコンパイル出来るのですが どういう理由が考えられるでしょうか?

  • コンパイルエラー

    VCでファイル(.c)をコンパイルしたところ 以下のエラーが出てしまいました。 error LNK2019: 未解決の外部シンボル _sqlcxt が関数 _xxxxxxxx で参照されました。 なんかの設定不足でしょうか? お分かりの方がおりましたら、よろしくお願いします。

  • Visual studio c++ dll作成時のエラー

    c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

  • Visual C++ 2005 Express EditionでLINK2019エラー

    Visual C++ 2003.netからVisual C++ 2005 Express Editionに移行した際に、以前書いたプログラムがリンクエラーで動かなくなってしまいました。 追加するLibディレクトリが足りないのかと思ったのですが、何が足りないのか見つけることができませんでした。 解決法を教えていただけないでしょうか。 OSはWindows XPです。 よろしくお願いします。 エラーメッセージの内容↓ ------------------------------- error LNK2019: 未解決の外部シンボル __imp__GetWindowPlacement@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PeekMessageA@20 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ValidateRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ShowWindow@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetWindowRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetClientRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__CreateWindowExA@48 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetSystemMetrics@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__RegisterClassExA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__LoadCursorA@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 現在追加されているLibディレクトリ↓ ------------------------------------------- $(VCInstallDir)lib $(VCInstallDir)PlatformSDK\lib $(FrameworkSDKDir)lib $(VSInstallDir) $(VSInstallDir)lib C:\Program Files\Microsoft Platform SDK\Lib C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib\x86

  • コンパイルエラー

    初めまして 当方VB6.0にてプログラムを組んでいるのですが、mid関数を入れてコンパイルをすると、 コンパイルエラー:プロジェクトまたはライブラリーが見つかりません と出てコンパイルできません。 このような問題はどうすれば解決できるのでしょうか? よろしくお願いします。

  • 【サーブレットのコンパイルエラーが解決できません】

    Servleteのコンパイルエラーについてご教授下さい。 protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { がソースなのですが、コンパイルすると SearchServlet.java:12: シンボルを解決できません。 シンボル: クラス IOException 場所 : SearchServlet の クラス throws ServletException, IOException { エラー 1 個 とIOExceptionの下に^がついて表示されます。 CLASSPATHも %CATALINA_HOME%\webapps\wl_jsp\WEB-INF\classes %JAVA_HOME%\lib\tools.jar %CATALINA_HOME%\common\lib\servlet-api.jar と設定してあり本やネットで調べたのですが解決できませんでした。 教えて下さい!お願い致します。

    • ベストアンサー
    • Java
  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }