Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 未指定库,但printf链接到C++;节目?_Visual C++_Runtime_Stdio - Fatal编程技术网

Visual c++ 未指定库,但printf链接到C++;节目?

Visual c++ 未指定库,但printf链接到C++;节目?,visual-c++,runtime,stdio,Visual C++,Runtime,Stdio,我有以下代码: #include <stdio.h> int main() { printf ("hello world\n"); return 0; } 这将生成simple.exe(编译器自动调用链接器),可执行文件将按预期显示“hello world”消息。当我查看可执行文件w/depends.exe时,它显示kernel32.dll是唯一的依赖项。当我转储kernel32.dll库的内容时,没有显示printf VC++是否采用了某种优

我有以下代码:

#include <stdio.h>

int main()
{
    printf ("hello world\n");
    return 0;
}
这将生成simple.exe(编译器自动调用链接器),可执行文件将按预期显示“hello world”消息。当我查看可执行文件w/depends.exe时,它显示kernel32.dll是唯一的依赖项。当我转储kernel32.dll库的内容时,没有显示printf


VC++是否采用了某种优化方法,使得printf以某种方式直接包含在最终的可执行文件中?如果是这样的话,它是如何被记录的?printf(实际上是fprintf到stdout)以及其他“标准”函数malloc、exit等都是与libc.lib静态链接的,这就是为什么您在任何地方都不会将其视为dll。

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

libc.lib
不再使用


VC++10上静态或动态包含C运行时库(CRT)的选项都有文档记录。您可以在项目选项中选择所需/所需的选项。

libc.lib
不再使用


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

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

若要使用您的示例,请使用:

cl simple.c
它将正确编译和链接。但是,如果您使用:

cl simple.c -link -nodefaultlib
您将获得:

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


完整地说,您还可以使用编译器的
/Zl
开关创建对象,而不嵌入任何库的名称。这主要用于创建静态库,因此它们不会嵌入可能与使用库的生成代码冲突的库的名称。

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

若要使用您的示例,请使用:

cl simple.c
它将正确编译和链接。但是,如果您使用:

cl simple.c -link -nodefaultlib
您将获得:

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


完整地说,您还可以使用编译器的
/Zl
开关创建对象,而不嵌入任何库的名称。这主要是为了创建静态库,因此它们不会嵌入可能与使用库的构建代码冲突的库名称。

正如Steve在下面所说的,libc不再可用,现在使用的是多线程版本的libcmt,但是想法是一样的-它是静态构建的,不使用DLLSE正如Steve在下面所说的,libc不再可用,现在使用的是多线程版本的libcmt,但是想法是一样的-它是静态构建的,不使用DLLShank you作为URL,我无法在MSDN迷宫中自己找到它。谢谢你的URL,无法在MSDN迷宫中单独找到它。我尝试了-nodefaultlib,得到了与您显示的完全相同的输出。谢谢。我尝试了-nodefaultlib,得到了与您显示的完全相同的输出。非常感谢。