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

Linking to C Library in a C++ application

本文关键字:应用程序 c++ 链接      更新时间:2023-10-16

我正在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

你试过用<cstdio>代替<stdio.h>吗?

在函数_do_stuff@20中引用的未解析的外部符号_printf

这意味着你没有链接printf函数的实现,它位于一个库中。

& lt; stdio.h>我想是在演播室吧?

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

printf库的位置取决于你如何链接到运行时(C/c++部分,代码生成小节——查看"运行时库")。这个KB中的表告诉您对于"Runtime Library"的每个值使用哪个标准的.lib

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

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