Имена экспортируемых функций не содержат списка аргументов - PullRequest
1 голос
/ 16 декабря 2009

Я создаю подключаемый модуль DLL с использованием c ++ в Eclipse.

При попытке загрузить плагин я получаю сообщение об ошибке:

?CTC_Cleanup@YAXXZ not found. Function is not available in myplugin.dll

При сравнении другого рабочего плагина с моим плагином с помощью Dependency Walker я замечаю, что имя функции в другом плагине: "void CTC_Cleanup(void)", включающее "Undecorate C++ functions" => "?CTC_Cleanup@YAXXZ".

В моем плагине имя функции: "CTC_Cleanup", включение "Undecorate C++ functions" не имеет значения.

Все мои объявления функций C ++ в файле .h украшены "__declspec(dllexport)" и заключены в

extern "C" {
...
...
...
}

/ Kristofer

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Он ищет искаженное имя, поэтому вам не нужен внешний "С".

? CTC_Cleanup @ YAXXZ использует искажение имени VC ++ для функции, которая принимает void и возвращает void с именем CTC_Cleanup.

Однако вы используете g ++ 3.x или 4.x, а g ++ использует другую несовместимую схему искажения.

Создайте свою библиотеку, используя VC ++, или выясните, как заставить g ++ использовать искажение имен VC ++.

0 голосов
/ 16 декабря 2009

Удалите extern "C", тогда он должен работать: я думаю, ваш плагин экспортирует функцию под ожидаемым именем.

0 голосов
/ 16 декабря 2009

Имена аргументов (на самом деле типы аргументов, формальные имена на самом деле не должны иметь значения на этом уровне) не должны иметь значения при использовании связи C; в C вы не перегружены, поэтому имени самой функции должно быть достаточно, типы аргументов не имеют значения.

...