2015-05-26 2 views
0

Во-первых, я уже несколько лет кодируюсь на C#, и это было давно, так как я написал любой код на C. Я использую Visual Studio 2013. Я работаю над образцом программы для продукта API, который делает моя компания. Большая часть программы находится в одном исходном файле & 1 файл заголовка. Программа должна анализировать XML, который возвращается вызовами API. Показывать, как анализировать XML, не является точкой примера, поэтому я решил, что программа будет определять простую функцию под названием GetXmlValue, чтобы скрыть детали синтаксического анализа XML. Я определил эту функцию в главном файле .C, как это:Почему я получаю «неразрешенную внешнюю» ошибку?

//--------------------- 
// XML processing function forward declaration 
// Note that the implementation of this functions is outside the scope of this program. You must implement it yourself 
// using a real XML library. 
//--------------------- 

// This function must return a value indicating the number of characters that were copied into the buffer. 
// If no characters were copied, the return value should be zero. It's OK if the function returns a negative value 
// to indicate that the XPath could not be found. 

extern int GetXmlValue(char *xml, char *xpath, char *buffer, int bufferSize); 

Затем в отдельном файле с именем ParseFunction.c, я реализовал эту функцию. Все компилируется без ошибок, но я получаю «неразрешенный внешний символ» Ошибка ссылка:

error LNK2019: unresolved external symbol "int __cdecl GetXmlValue(char *,char *,char *,int)" ([email protected]@[email protected]) referenced in function "int __cdecl parseCommandType(char *)" ([email protected]@[email protected]) C:...\LPRSDK_Sample\Sample\Sample.obj

В качестве эксперимента, я закомментирована линии в функции, в которой сообщалось об ошибке, чтобы увидеть, если есть что-то неправильно с этой конкретной строкой, и ошибка просто перешла к следующей функции, в которой была вызвана функция.

Если я переведу код для функции в файл C примера программы, все компилируется и связывается. Так что это, вероятно, что-то в моих настройках ссылок, но я недостаточно знаком со всеми настройками языка VS 2013 C, чтобы даже знать, где искать.

Я проверил файл журнала, и я вижу, что файл .obj для обоих исходных файлов включен, поэтому я не понимаю, почему я вообще получаю неразрешенную внешнюю символьную ошибку. Что я сделал не так?

+1

Вы уверены, что 'ParseFunction.o' (или' .obj') связан с вашим основным файлом? – CiaPan

+0

Функция определена в файле .c, а файл журнала показывает, что оба файла .obj включены в команду link Что касается отдельного ParseFunction.h, я тоже этого не делал. –

+0

Если это не большой проект со многими файлами, попробуйте перестроить завершить проект и опубликовать полный журнал сборки в вашем вопросе. –

ответ

0

Я нашел его. Сотрудник предложил что-то, и он был на правильном пути.

я переехал декларацию Экстерна функции в так это происходило перед любыми определениями типов, а затем положить его внутри блока «экстерн„C“, как этот

extern "C" { 
    int GetXmlValue(char *xml, char *xpath, char *buffer, int bufferSize); 
} 

и теперь все компилируется и правильно.

+0

Затем функция вызывается из кода C++. C++ имеют [* name mangling *] (http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B), что делает имена функций такими, как количество аргументов и типов, поэтому фактический символ кода C (без mangling) не может быть найден. Что «extern» C «' делает в C++ (он даст вам ошибки при компиляции с компилятором C) - это превращение имени для символа. –

+0

Я переместил закрывающуюся фигурную скобку, так что весь файл, минус #defines и #includes в нем, находится внутри внешнего блока «C». Все еще компилируется. Я попытался изменить параметр «C/C++ | Advanced | Compile As» на «Compile as C code» и что не работал, поэтому я положил блок «extern» C «'назад. Спасибо за помощь. –

Смежные вопросы