LNK2019: неразрешенный внешний символ в функции

0

Я использую VS2008 WinCE7. Я сталкиваюсь с ошибкой связывания во время сборки.

Структура файловой системы

menu.c - ./menu.c
eboot.h - ./eboot.h
file_1.cpp - ./dir1/file_1.cpp

где . представляет текущий каталог

menu.c

#include <eboot.h>

static VOID OALWriteToEMMC(OAL_BLMENU_ITEM *pMenu);

VOID OALWriteToEMMC(OAL_BLMENU_ITEM *pMenu)
{
     OALTestEMMC();
}

file_1.cpp

#include <eboot.h>

VOID OALTestEMMC();

VOID OALTestEMMC()
{
//some code
}

eboot.h

 VOID OALTestEMMC();

Я получаю ошибку

menu.obj : error LNK2019: unresolved external symbol OALTestEMMC referenced in function OALWriteToEMMC

Пожалуйста, помогите мне, как его решить.

EDIT1:

menu.c

#ifdef __cplusplus
extern "C" VOID OALTestEMMC();
#endif

и удалил объявление в eboot.h и добавил его в file_1.cpp Но ошибка сохраняется.

  • 0
    @JimLewis Да. Я отредактировал свой пост.
Теги:
visual-studio-2008
windows-ce

2 ответа

2
Лучший ответ

Кажется, что вы компилируете определение функции в C++, но используете эту функцию в C. Без использования функции extern "C" в C++, компилятор будет калечить имя и сгенерировать символ, который не будет соответствие декларации, используемой в коде C.

Если вы хотите смешивать C и C++, убедитесь, что объявления в C++ отмечены extern "C" чтобы компилятор не исказил имена и будет использовать соглашения о вызове C. В качестве альтернативы, скомпилируйте все в C++ (или в C)

  • 0
    Я попробовал это, как упомянуто в EDIT1. Но ошибка сохраняется. Кроме того, я попробовал это по-другому, как в оригинальном посте перед редактированием. Это тоже не сработало.
  • 0
    @Gomu: вы ошиблись. Вам нужно дать команду file_1.cpp обработки C ++ не file_1.cpp . Обработка компилятором C menu.c не menu.c к искажению. Обычный подход заключается в добавлении этого кода в заголовок, где он может использоваться всеми модулями перевода, которые используют эту функцию.
Показать ещё 5 комментариев
1

Первоначальный ответ Дэвида Родригеса правильный. Вы вызываете функцию C++ (OALTestEMMC) из исходного файла C. Как уже упоминалось Давид, C++ компилятор калечить имя функции. Чтобы подавить имя, чтобы код в menu.c мог вызывать его, поместите квалификатор "extern" C "в функцию OALTestEMMC (в файле_1.cpp):

extern "C" VOID OALTestEMMC();

extern "C" VOID OALTestEMMC() {
    // stuff
}
  • 0
    Спасибо за объяснение с иллюстрацией!
  • 0
    Включен ли file_1.obj в список файлов, которые использует компоновщик? Можете ли вы включить содержимое файла ./sources?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню