在Visual Studio 2005中编译Win32“hello world”的命令行

时间:2013-12-26 01:57:01

标签: c++ windows winapi visual-studio-2005

以下基本的Win32程序在Dev-C ++中编译得很好。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    MessageBox(NULL,"Hello, world!","My app", MB_OK ) ;
}

但是现在我正在尝试使用Visual Studio 2005编译它。我打开Visual Studio命令提示符并输入:

cl test.cpp

但我收到以下错误:

test.cpp
test.obj : error LNK2019: unresolved external symbol __imp__MessageBoxA@16 referenced in function _WinMain@16
test.exe : fatal error LNK1120: 1 unresolved externals

我认为问题可能是链接器的路径,但根据此MSDN page,链接器在环境变量LIB中查找它,该变量已在Visual Studio提示符中设置为:

C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;
C:\Program Files\Microsoft Visual Studio 8\VC\LIB;
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib;
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;

在命令行中编译Win32程序还需要什么?

我正在使用Vista的Visual Studio 2005 SP1更新。

3 个答案:

答案 0 :(得分:11)

user32.lib添加到命令中:它是user32.dll的导入库,默认情况下由g ++链接,但不是由Visual C ++链接。

一般情况下,只需检查链接器抗议的任何功能的文档。


请注意,您不需要使用该非标准Microsoft怪物WinMain

而只是使用标准C ++ main

然后使用Microsoft的链接器,如果您想要GUI子系统可执行文件,请添加选项/entry:mainCRTStartup


Minimal C ++ 03示例:

#define UNICODE
#include <windows.h>

int main()
{
    MessageBox( 0, L"Hello, world!", L"My app:", MB_SETFOREGROUND );
}

使用Visual C ++ 12.0作为GUI子系统可执行文件从命令行构建:

[D:\dev\test]
> set cl & set link
CL=/EHsc /GR /FI"iso646.h" /Zc:strictStrings /we4627 /we4927 /wd4351 /W4 /D"_CRT_SECURE_NO_WARNINGS" /nologo
LINK=/entry:mainCRTStartup /nologo

[D:\dev\test]
> cl winhello.cpp /Fe"hello" /link /subsystem:windows user32.lib
winhello.cpp

答案 1 :(得分:1)

您需要链接User32库。在您的包含

下方添加此内容
#pragma comment(lib,"User32.lib")

#pragma允许您向编译器提供其他信息

#pragma comment(lib,“library.lib”)允许用户将此注释传递给链接器以指定要链接的其他库

答案 2 :(得分:-2)

使用C

的WIN32应用程序的命令行编译

cl w1.c / subsystem:windows gdi32.dll user32.dll

设置以下环境变量 包括 LIB PATH