我正在使用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
答案 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添加到您的链接器行,它将告诉您它所查找的每个库(在链接器部分的命令行小节中执行此操作)