41814


下記のコードをcmd.exe (Developer Command Prompt for VS2017)から  
コンパイルするとエラーが出ます。  
文字コードが関係しているようですがどうすればいいのでしょうか?

なぜでしょうか?

ちなみにこのソースコードはUTF-8(non-BOM)、改行コードはLFです

環境:  
Visual Studio 2017 Community  
Windows 10 Home 1709

helloworld.cpp:

[code]

    #include <windows.h>
    
    
    int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wchar_t *pCmdLine, int nCmdShow) {
        MessageBox(NULL, TEXT("helloworld"), TEXT("1"), MB_OK);
    }
    
[/code]

compile option:

[code]

    cl -EHsc -Fehelloworld helloworld.cpp
    
[/code]

Error:

[code]

    /out:helloworld.exe
    helloworld.obj
    helloworld.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _wWinMain@16 で参照されました。
    helloworld.exe : fatal error LNK1120: 1 件の未解決の外部参照
    
[/code]


CC BY-SA 3.0
2018-02-17T14:25:26.510
41813
2018-02-17T23:46:18.900
5246
question
c++ windows visual-studio
Visual Studio 2017でMessageBoxを呼び出せない


[MessageBox](https://msdn.microsoft.com/en-
us/library/ms645505\(v=vs.85\).aspx)はドキュメントに

> **Header** : Winuser.h (include Windows.h)  
>  **Library** : User32.lib

とあるようにヘッダーファイル`Windows.h`をインクルードするとともにライブラリファイル`User32.lib`にリンクする必要があります。

[code]

    cl -EHsc -Fehelloworld helloworld.cpp User32.lib
    
[/code]

もしくはVisual C++では[`#pragma`にてライブラリファイルを指定](https://docs.microsoft.com/ja-
jp/cpp/preprocessor/comment-c-cpp)できます。ソースコード中に

[code]

    #pragma comment(lib, "User32.lib")
    
[/code]

と記述することでコンパイルオプションに依存せずビルドできるようにもなります。

* * *

> Developer Command Prompt for
> VS2017を使っているので`User32.lib`は環境変数`LIBPATH`か`LIB`に自動的に設定されているのだと思っていたのですが、見当違いでしょうか?
> また、毎回コンパイルの度に指定したり、`#pragma`を使ったりせずにビルドする方法はありますか?

Developer Command Prompt for
VS2017は各種Pathが通されているだけです。ですので必要な引数等が分かっている、ある程度のスキルを持っている人を対象としているのだと思います。

一般的にはIDEを立ち上げてプロジェクトを作成することです。プロジェクトファイルでは最終的に`C:\Program Files
(x86)\Microsoft Visual
Studio\2017\Enterprise\???\IDE\VC\VCTargets\Microsoft.Cpp.CoreWin.props`が取り込まれます。このファイルでは次のライブラリに自動的にリンクされます。

  * `kernel32.lib`
  * `user32.lib`
  * `gdi32.lib`
  * `winspool.lib`
  * `comdlg32.lib`
  * `advapi32.lib`
  * `shell32.lib`
  * `ole32.lib`
  * `oleaut32.lib`
  * `uuid.lib`
  * `odbc32.lib`
  * `odbccp32.lib`

ただしあくまで上記に挙げたライブラリにリンクされるだけです。例えばソケットライブラリは含まれていなかったりするため、やはり必要に応じて適切なライブラリを指定することになります。


CC BY-SA 3.0
2018-02-17T14:38:35.310
41814
2018-02-17T23:46:18.900
2018-02-17T23:46:18.900
4236
4236
41813
answer