2014-02-16 76 views
2

我遇到了VC++編譯器的問題。我已經安裝了Windows SDK與編譯器,庫和頭文件,並試圖編譯一個測試程序,像這樣:VC++標準庫鏈接錯誤

#include <cstdio> 

int main(int argc, char* argv[]) { 
    printf("%s", "Hello world!"); 
    return 0; 
} 

這是命令行腳本我使用編譯:

@echo off 
set clpath=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 
set clname=cl.exe 
set linkpath=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 
set linkname=link.exe 
set libpath=/libpath:"C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib" /libpath:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib" 
set includepath=/I "C:\Program Files\Microsoft SDKs\Windows\v7.1\Include" /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" 

set subsystem=console 
set entry=main 
set libfiles= 

set cfiles=hello.cpp 
set objfiles=hello.obj 

set path=%clpath% 
%clname% %includepath% /c %cfiles% 
set path=%linkpath% 
%linkname% %libpath% /subsystem:%subsystem% /entry:%entry% %libfiles% %objfiles% 

而這裏的輸出:

Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64 
Copyright (C) Microsoft Corporation. All rights reserved. 

hello.cpp 
Microsoft (R) Incremental Linker Version 10.00.30319.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

hello.obj : error LNK2019: unresolved external symbol printf referenced in function main 
hello.exe : fatal error LNK1120: 1 unresolved externals 

鏈接程序很好,只要我並不想引用任何標準庫函數。我試着用NODEFAULTLIB和DEFAULTLIB開關搞亂,並指定標準庫直接鏈接到,無濟於事。

回答

0

您的庫路徑是錯誤的。此文件夾:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib 

包含x86庫。你的目標AMD64,所以你需要的AMD64庫,來自:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64 

(你還需要爲Windows SDK正確的AMD64庫路徑;我沒有安裝V7.1做的,所以我不知道那是什麼)

請注意,你可以簡單地通過運行帶有所有正確的路徑和環境變量的配置環境:

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64 

相關提示,設置/entry:main是錯誤的:入口點需要是CRT初始化入口點。如果您定義了main函數,那麼這是mainCRTStartup。鏈接器默認選擇此函數作爲入口點,因此您不需要使用/entry指定入口點。

+0

哦!當然,我多麼愚蠢。非常感謝!另外,我正在使用入口開關,因爲我還得到了一個未解決的對crt初始化例程的引用,但現在顯然也解決了這個問題。 – glank

0

嘗試增加libcmt.liblibfiles=

點擊here侵害在Windows上C-庫連接的詳細信息。

順便說一句。運行VC++的主要優點是一個好的IDE。爲什麼你需要從命令行構建它?

+0

我已經試過這個,不起作用。這個問題看起來很奇怪。是的,我真的很想念我的老IDE,但我現在無法使用它。原因並不重要。此外,我只是想寫一個小程序,應該花一個小時。我一直試圖讓鏈接器正常工作三個小時。 – glank