链接到C ++应用程序中的C库

时间:2011-10-19 15:16:38

标签: c++ c visual-c++ linker extern

我正在使用Visual Studio 2010中的C / C ++应用程序。该解决方案有几个项目可以编译并汇总到一个可执行文件中。我正在尝试添加print语句来调试一些关键函数。

我在其中一个.c文件的函数中添加了printf语句。我已经注意包括<stdio.h>。 C标头包含在更高的C ++文件中。我知道C和C ++链接器的运行方式和extern强制行为之间存在差异。但是,我不是细微差别的专家。

代码的设置方式如下:

    // proc.h
    #ifdef __cplusplus
    extern "C" {
    #endif

    void do_stuff();

    #ifdef __cplusplus
    }
    #endif

    -----------------------------------------------

    // proc.c
    #include "proc.h"
    #include <stdio.h>

    void do_stuff()
    {
        printf("Hello from proc.c -- do_stuff()");
        // Some other stuff
    }


当我构建应用程序时,我在VS输出窗口中看到以下错误消息:
[proj path]\common.lib(proc.obj) : error LNK2019: unresolved external symbol _printf referenced in function _do_stuff@20


我还尝试将#include <stdio.h>放在头文件中,而不是c文件中。在这种情况下,我得到:
error LNK2001: unresolved external symbol printf

3 个答案:

答案 0 :(得分:1)

您是否尝试使用<cstdio>代替<stdio.h>

答案 1 :(得分:1)

  

函数_do_stuff @ 20

中引用的未解析的外部符号_printf

这意味着您没有链接printf函数的实现,该函数位于lib。

对于&lt; stdio.h&gt;我相信它在cstdio?

答案 2 :(得分:1)

转到项目的属性,然后转到“链接器”部分。在Input子部分中,您是忽略默认库,还是列出了要忽略的库?

库printf取决于您如何链接到运行时(C / C ++部分,代码生成子部分 - 查看“运行时库”)。此KB中的表格告诉您哪个标准.lib用于“运行时库”的每个值

http://msdn.microsoft.com/en-us/library/6wtdswk0(v=vs.71).aspx

要弄清楚发生了什么,可以将/ VERBOSE:LIB添加到您的链接器行,它将告诉您它所查找的每个库(在链接器部分的命令行小节中执行此操作)