Из документации QLibrary
:
Символ должен быть экспортирован как функция C из библиотеки.Это означает, что функция должна быть заключена в extern "C"
, если библиотека скомпилирована с помощью компилятора C ++.В Windows вы также должны явно экспортировать функцию из DLL, используя директиву компилятора __declspec(dllexport)
. Вы должны добавить extern "C"
к объявлению и определению API_Initial
:
extern "C" int API_Initial(char *machineType, int totalLayers, char *fileName)
или заключите его в блок extern "C"
:
extern "C" {
int API_Initial(char *machineType, int totalLayers, char *fileName);
}
C ++ имеет перегрузку функций, но для каждой функции требуется уникальное имя для использования компоновщиком.Для этого имена искалечены для кодирования их подписи.Это означает, что int foo(int)
и int foo(double)
имеют разные имена, и компоновщик может их различать, но ни один из них не называется foo
.Одна называется ?foo@@YAHH@Z
, а другая - ?foo@@YAHN@Z
(в Windows. Другие платформы имеют разные схемы искажения имен, но идея та же).
Это означает, что когда QLibrary
ищетимя API_Initial
это не может найти это.Он может найти имя ?API_Initial@@YAHPEADH0@Z
, но нет хорошего независимого от платформы способа получить это имя.
Добавление extern "C"
в объявление функции отключает искажение этого имени, но исключает функциюперегрузка, ограничивает имя глобальным пространством имен и ограничивает интерфейс функции только тривиально копируемыми типами объектов и указателями.