Связывание с библиотекой C в приложении C ++ - PullRequest
1 голос
/ 19 октября 2011

Я работаю над приложением C / C ++ в Visual Studio 2010. В решении есть несколько проектов, которые скомпилированы и объединены в один исполняемый файл.Я пытаюсь добавить операторы print для отладки нескольких критических функций.

Я добавил оператор printf в функцию в одном из файлов .c.Я позаботился о том, чтобы включить <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 ]

1 голос
/ 19 октября 2011

неразрешенный внешний символ _printf, на который ссылается функция _do_stuff @ 20

Это означает, что вы не создаете ссылки в реализации функции printf, которая находится в библиотеке.

ДляЯ верю, что это в cstdio?

1 голос
/ 19 октября 2011

Перейдите в свойства вашего проекта и перейдите в раздел Linker. В подразделе «Вход» вы игнорируете библиотеки по умолчанию или у вас есть какие-либо библиотеки в списке для игнорирования?

Библиотека printf зависит от того, как вы ссылаетесь на среду выполнения (раздел C / C ++, подраздел Code Generation - см. «Библиотека времени выполнения»). Таблица в этом КБ говорит вам, какой стандартный .lib использовать для каждого значения «Runtime Library»

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

Чтобы выяснить, что происходит, вы можете добавить / VERBOSE: LIB к вашей строке компоновщика, которая сообщит вам каждую библиотеку, в которой она была просмотрена (Сделайте это в подразделе командной строки в разделе компоновщика)

1 голос
/ 19 октября 2011

Вы пытались использовать <cstdio> вместо <stdio.h>?

...