C ++标准库链接错误

时间:2014-02-16 01:27:51

标签: c++ visual-c++ reference hyperlink

我遇到了VC ++编译器的问题。我已经安装了带有编译器,库和头文件的windows sdk,并试图像这样编译测试程序:

#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开关以及指定要直接链接的标准库,但无济于事。

2 个答案:

答案 0 :(得分:0)

尝试将 libcmt.lib 添加到libfiles=

单击here以获取有关在Windows上链接C-lib的更多信息。

顺便说一句。运行VC ++的主要优点是一个很好的IDE。为什么需要从命令行构建它?

答案 1 :(得分: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指定入口点。