未指定库,但printf已链接到C ++程序?

问题描述 投票:0回答:3

我有以下代码:

#include <stdio.h>

int main()
{
    printf ("hello world\n");
    return 0;
}

在Windows 7 x86上使用MSVC ++ 10.0,我在命令行上如下编译它:

cl.exe simple.cpp

这会生成simple.exe(编译器会自动调用链接器),并且可执行文件会按预期显示“ hello world”消息。当我查看带有w.depends.exe的可执行文件时,它显示kernel32.dll是唯一的依赖项。当我转储kernel32.dll库的内容时,没有显示printf。

VC ++是否采用某种优化,以便将printf以某种方式直接包含在最终可执行文件中?如果是这样,怎么办?在任何地方都有记录吗?

非常感谢-

Todd

visual-c++ runtime stdio
3个回答
1
投票

libc.lib不再使用。

在VC ++ 10上静态或动态包含C运行时库(CRT)的选项已记录在here中。您可以在“项目选项”中选择所需/需要的选项。


2
投票

MS VC将“默认”库的名称嵌入到大多数目标文件中。除非您使用链接程序的-nodefaultlib选项另外指定,否则将链接该一个或多个库。如果您单独使用它,它不会链接any默认库。另外,您可以指定一个特定的库,例如-nodefaultlib:mylib.lib,在这种情况下,它将链接所有默认库except在此处指定的所有库。

使用示例,如果使用:

cl simple.c

它将正确编译并链接。但是,如果您使用:

cl simple.c -link -nodefaultlib

您将获得:

simple.obj:错误LNK2019:函数main中引用的未解析的外部符号printf链接:错误LNK2001:无法解析的外部符号mainCRTStartupsimple.exe:致命错误LNK1120:2个未解决的外部组件

只需完成,您还可以使用编译器的/Zl开关来创建对象,而无需嵌入任何库的名称。 (主要)目的是为了创建静态库,因此它们不会嵌入可能与之冲突的库的名称,但是您构建使用该库的代码。


0
投票

printf(实际上是fprintf到stdout)以及其他“标准”函数malloc,exit等与libc.lib静态链接,这就是为什么您在任何地方都看不到它是dll的原因。

© www.soinside.com 2019 - 2024. All rights reserved.