У меня есть сторонняя библиотека, написанная на C. Она экспортирует все свои функции в DLL.
У меня есть файл .h, и я пытаюсь загрузить DLL из моей программы на C ++.
Первое, что я попробовал, было окружение частей, где я включаю стороннюю библиотеку в
#ifdef __cplusplus
extern "C" {
#endif
и, в конце
#ifdef __cplusplus
} // extern "C"
#endif
Но проблема была в том, что все ссылки на функции DLL-файлов выглядели так в их заголовочных файлах:
a_function = (void *)GetProcAddress(dll, "a_function");
В то время как на самом деле a_function
имел тип int (*a_function) (int *)
. Очевидно, компилятору MSVC ++ это не нравится, а компилятору MSVC, похоже, не против.
Итак, я прошел (жестокие пытки) и зафиксировал их все по образцу
typedef int (*_x_a_function) (int *); // using _a_function will not work, C uses it!
_x_a_function a_function ;
Затем, чтобы связать его с кодом DLL, в main ():
a_function = (_x_a_function)GetProcAddress(dll, "a_function");
Это, как кажется, делает компилятор НАМНОГО, НАМНОГО счастливее, но ОЧЕНЬ жалуется на этот последний набор из 143 ошибок, каждая из которых говорит для каждой попытки соединения с DLL:
error LNK2005: _x_a_function already defined in main.obj main.obj
Многочисленные ошибки определения символов .. звучит как работа для extern
! Поэтому я пошел и сделал ВСЕ объявления указателя функции следующим образом:
function_pointers.h
typedef int (*_x_a_function) (int *);
<b>extern</b> _x_a_function a_function ;
И в файле cpp:
function_pointers.cpp
#include "function_pointers.h"
_x_a_function a_function ;
ВСЕ нормально и модно .. за исключением ошибок компоновщика, теперь вида:
error LNK2001: unresolved external symbol _a_function main.obj
Main.cpp включает "function_pointers.h", поэтому он должен знать, где найти каждую из функций.
Я сбит с толку. Есть ли у кого-нибудь указатели, чтобы заставить меня функционировать? (Простите за каламбур ..)