2012-11-11 68 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

相關問題