Я работаю над проектом в Visual Studio 2010, который должен создать файл win 32 dll. У меня есть примеры C-файлов и компиляции, которые хорошо работают. Я хотел бы включить некоторые функциональные возможности из написанной мной функции C ++, но я натолкнулся на стену.
Если я попытаюсь связать функции C ++ с программой C, он ничего не знает о строках и т. Д. И просто не работает вообще (конечно).
Так что мне осталось изменить пример на программу на C ++, тогда я могу безнаказанно использовать другие мои файлы. Когда я пытаюсь сделать это, я получаю ошибку ссылки, которую я не понимаю, и не знаю, как ее устранить.
В примерах используются предоставленные поставщиком заголовки, которые включают такие выражения, как
typedef void ( __cdecl *BINDING_PROC_BEVNT)(WORD_T choice, INT_T * pStatus,
I_EVNT_T * pIn, O_EVNT_T * pOut);
В теле основного кода следующие примеры:
extern BINDING_PROC_BEVNT b_evnt;
Который затем позволяет писать
b_evnt(choice, &status, &inpEvent, &outpEvent);
В файле C, предоставленном поставщиком, они снова называются:
BINDING_PROC_BEVNT b_evnt;
b_evnt = (BINDING_PROC_BEVNT)GetProcAddress(hCNCMod, "bevnt");
Я вижу ошибку компоновщика:
ошибка LNK2001: неразрешенный внешний символ "void (__cdecl * b_evnt) (беззнаковое короткое, короткое *, объединение I_EVNT_T *, объединение O_EVNT_T *)" (? B_evnt @@ 3P6AXGPAFPATI_EVNT_T @@ PATO_EV@A @) @
Если я переименую свой основной файл и перекомпилирую как программу на C, а мои функции на C ++ опущены, все прекрасно скомпилируется. Даже когда основной файл обрабатывается как файл C ++, Intellisense, похоже, распознает определения (при наведении курсора отображаются правильные определения).
Кроме того, я попытался добавить extern "C" в несколько разных мест, но это, похоже, не имело значения в файлах C ++, и сгенерировал ошибку компиляции в файлах C (о незнании строк).
Любое понимание было бы оценено, возможно, я просто слишком долго смотрел на это сегодня, чтобы понять что-то очевидное, или это может быть что-то, чего я совершенно не осознаю.
Спасибо за помощь!