代码之家  ›  专栏  ›  技术社区  ›  Sabuncu

没有指定的库,但是PrtTF被链接到C++程序中?

  •  0
  • Sabuncu  · 技术社区  · 15 年前

    我有以下代码:

    #include <stdio.h>
    
    int main()
    {
        printf ("hello world\n");
        return 0;
    }
    

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

    cl.exe simple.cpp
    

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

    VC++是否采用某种优化,使得PrPTF在某种程度上直接包含在最终的可执行文件中?如果是,如何记录,是否有记录?

    多谢提前-

    托德

    3 回复  |  直到 15 年前
        1
  •  1
  •   Steve Townsend    15 年前

    libc.lib 不再使用。

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

        2
  •  2
  •   Jerry Coffin    15 年前

    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 切换以创建对象,而不嵌入任何库的名称。这主要是为了创建静态库,因此它们不会嵌入库的名称,而与使用库的代码生成冲突。

        3
  •  0
  •   Marin    15 年前

    PrtTF(实际上FPrtotf到STDUT)以及其他“标准”函数Maloc、Exchange等都与LIbC.LIB静态链接,这就是为什么您不把它看作任何地方的DLL。

    推荐文章