2014-02-16 57 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