2012-11-11 36 views
3

我最近在“Windows Vista Home Premium”机器上下载了“Microsoft Visual C++ 2010 Express”版本。我是一个Java程序员试图使切换到C++,这是很令人沮丧:Visual C++ 2010:LNK1104,LNK1181 - .obj文件不会自动生成

  1. 我打开Visual C++
  2. “文件 - >新建 - >项目......”
  3. 选择“ Win32应用程序”,默认情况下,默认情况下,默认情况下,等... “完成”
  4. 右键单击解决方案(或项目) - > “生成”
  5. 输出窗口显示,

    ------ Build started: Project: Engine, Configuration: Debug Win32 ------ 
    LINK : fatal error LNK1104: cannot open file 'Debug\Engine.obj' 
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
    

我有时还会收到“LNK1181”错误。问题是编译器找不到这些对象,但如果我没有弄错,编译器应该在编译期间自动生成这些.obj文件。我检查了'Engine.obj'的'Debug'文件夹 - 这是一个空文件夹。那么,为什么不是Visual C++创建这些.obj文件?有人能够客观地告诉我为什么Visual C++不会生成这些.obj文件吗?作为一个侧面说明,我有一个暗示,这可能与我的系统类型(x32 vs x64)有关。我很确定我在基于x64的硬件上运行“Windows Vista Home Premium(x32)”。我遇到了微软Silverlight(当然是微软)的问题,它为我提供了错误的.exe文件,因为网站使用我的硬件凭据来确定哪种版本适合我的电脑。 x64不会安装在我的机器上,但是当我进入“系统信息”时,在“系统类型”下它会显示“基于x64的PC”。后来安装的x32版本很好。也许与我服务的Visual C++版本存在兼容性问题?

更新:我试过安装Visual Studio 2010的x64版本 - 没有。同样的问题。

Engine.cpp:

// Engine.cpp : Defines the entry point for the application. 
    // 

    #include "stdafx.h" 
    #include "Engine.h" 

    #define MAX_LOADSTRING 100 

    // Global Variables: 
    HINSTANCE hInst;        // current instance 
    TCHAR szTitle[MAX_LOADSTRING];     // The title bar text 
    TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name 

    // Forward declarations of functions included in this code module: 
    ATOM    MyRegisterClass(HINSTANCE hInstance); 
    BOOL    InitInstance(HINSTANCE, int); 
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 

    int APIENTRY _tWinMain(HINSTANCE hInstance, 
       HINSTANCE hPrevInstance, 
       LPTSTR lpCmdLine, 
       int  nCmdShow) 
    { 
     UNREFERENCED_PARAMETER(hPrevInstance); 
     UNREFERENCED_PARAMETER(lpCmdLine); 

// TODO: Place code here. 
MSG msg; 
HACCEL hAccelTable; 

// Initialize global strings 
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 
LoadString(hInstance, IDC_ENGINE, szWindowClass, MAX_LOADSTRING); 
MyRegisterClass(hInstance); 

// Perform application initialization: 
if (!InitInstance (hInstance, nCmdShow)) 
{ 
    return FALSE; 
} 

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ENGINE)); 

// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

return (int) msg.wParam; 
} 



    // 
    // FUNCTION: MyRegisterClass() 
    // 
    // PURPOSE: Registers the window class. 
    // 
    // COMMENTS: 
    // 
    // This function and its usage are only necessary if you want this code 
    // to be compatible with Win32 systems prior to the 'RegisterClassEx' 
    // function that was added to Windows 95. It is important to call this function 
    // so that the application will get 'well formed' small icons associated 
    // with it. 
    // 
    ATOM MyRegisterClass(HINSTANCE hInstance) 
    { 
WNDCLASSEX wcex; 

wcex.cbSize = sizeof(WNDCLASSEX); 

wcex.style   = CS_HREDRAW | CS_VREDRAW; 
wcex.lpfnWndProc = WndProc; 
wcex.cbClsExtra  = 0; 
wcex.cbWndExtra  = 0; 
wcex.hInstance  = hInstance; 
wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ENGINE)); 
wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_ENGINE); 
wcex.lpszClassName = szWindowClass; 
wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

return RegisterClassEx(&wcex); 
    } 

    // 
    // FUNCTION: InitInstance(HINSTANCE, int) 
    // 
    // PURPOSE: Saves instance handle and creates main window 
    // 
    // COMMENTS: 
    // 
    //  In this function, we save the instance handle in a global variable and 
    //  create and display the main program window. 
    // 
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
    { 
     HWND hWnd; 

     hInst = hInstance; // Store instance handle in our global variable 

     hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

     if (!hWnd) 
     { 
      return FALSE; 
     } 

     ShowWindow(hWnd, nCmdShow); 
     UpdateWindow(hWnd); 

     return TRUE; 
    } 

    // 
    // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) 
    // 
    // PURPOSE: Processes messages for the main window. 
    // 
    // WM_COMMAND - process the application menu 
    // WM_PAINT - Paint the main window 
    // WM_DESTROY - post a quit message and return 
    // 
    // 
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
int wmId, wmEvent; 
PAINTSTRUCT ps; 
HDC hdc; 

switch (message) 
{ 
case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections: 
    switch (wmId) 
    { 
    case IDM_ABOUT: 
     DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 
     break; 
    case IDM_EXIT: 
     DestroyWindow(hWnd); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    break; 
case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 
    // TODO: Add any drawing code here... 
    EndPaint(hWnd, &ps); 
    break; 
case WM_DESTROY: 
    PostQuitMessage(0); 
    break; 
default: 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
return 0; 
    } 

    // Message handler for about box. 
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
UNREFERENCED_PARAMETER(lParam); 
switch (message) 
{ 
case WM_INITDIALOG: 
    return (INT_PTR)TRUE; 

case WM_COMMAND: 
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
    { 
     EndDialog(hDlg, LOWORD(wParam)); 
     return (INT_PTR)TRUE; 
    } 
    break; 
} 
return (INT_PTR)FALSE; 
    } 

Engine.log:

LINK : fatal error LNK1104: cannot open file 'Debug\Engine.obj' 
+0

你有一个Engine.cpp,如果是的话它是什么? – Caribou

+0

你可以将你的编译详细程度设置为诊断,然后执行重建? –

+0

我在哪里设置编译器的详细程度?我已经尝试了许多变化的清理/重建,并且我试图在调试/发布模式下进行编译。没有。 – MrMysterious2502

回答

0

试图完全一样的Windows 7 X64的使用Visual C++ 2010年似乎确定。

这是VISUAL C++的Engine.cpp产生:

// Engine.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

这里是生成输出:

1>------ Build started: Project: Engine, Configuration: Debug Win32 ------ 
1>Build started 11/11/2012 2:18:10 PM. 
1>PrepareForBuild: 
1> Creating directory "c:\users\administrator\documents\visual studio 2010\Projects\Engine\Debug\". 
1>InitializeBuildStatus: 
1> Creating "Debug\Engine.unsuccessfulbuild" because "AlwaysCreate" was specified. 
1>ClCompile: 
1> stdafx.cpp 
1> Engine.cpp 
1>LinkEmbedManifest: 
1> Engine.vcxproj -> c:\users\administrator\documents\visual studio 2010\Projects\Engine\Debug\Engine.exe 
1>FinalizeBuildStatus: 
1> Deleting file "Debug\Engine.unsuccessfulbuild". 
1> Touching "Debug\Engine.lastbuildstate". 
1> 
1>Build succeeded. 
1> 
1>Time Elapsed 00:00:02.97 
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 
+0

不,我正在编译'Win32应用程序',而不是控制台应用程序。但是,为了争辩,我也这样做了。我为Win32应用程序(LNK1104和LNK1181)收到了与控制台应用程序相同的错误。我也使用Vista,你正在使用Windows 7. – MrMysterious2502

+0

是的,我明白。但它在Vista和7上都可以正常工作。让我看看更多一点。 –

+0

Win32 Application works too :( –

0

转到以下路径

项目 - >属性 - > c/C++ - >生成预处理文件

只是将其设置为否

+1

Project - > Properties - > C/C++下没有“生成预处理文件”,但是在Project - > Properties - > C/C++ - > Preprocessor下找到了“Preprocess to a file” ;它已经设置为“否”。 – MrMysterious2502

相关问题