Я использую 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
Но ошибка сохраняется.
Кажется, что вы компилируете определение функции в C++, но используете эту функцию в C. Без использования функции extern "C"
в C++, компилятор будет калечить имя и сгенерировать символ, который не будет соответствие декларации, используемой в коде C.
Если вы хотите смешивать C и C++, убедитесь, что объявления в C++ отмечены extern "C"
чтобы компилятор не исказил имена и будет использовать соглашения о вызове C. В качестве альтернативы, скомпилируйте все в C++ (или в C)
file_1.cpp
обработки C ++ не file_1.cpp
. Обработка компилятором C menu.c
не menu.c
к искажению. Обычный подход заключается в добавлении этого кода в заголовок, где он может использоваться всеми модулями перевода, которые используют эту функцию.
Первоначальный ответ Дэвида Родригеса правильный. Вы вызываете функцию C++ (OALTestEMMC) из исходного файла C. Как уже упоминалось Давид, C++ компилятор калечить имя функции. Чтобы подавить имя, чтобы код в menu.c мог вызывать его, поместите квалификатор "extern" C "в функцию OALTestEMMC (в файле_1.cpp):
extern "C" VOID OALTestEMMC();
extern "C" VOID OALTestEMMC() {
// stuff
}