Есть ли способ подавить искажение имен c ++?
-
05-09-2019 - |
Вопрос
У меня есть DLL, написанная на C ++, и я хочу подавить искажение имен для нескольких экспортируемых методов.Методы являются глобальными и не являются членами какого-либо класса.Есть ли способ достичь этого?
КСТАТИ:Я использую VS2008.
Решение
"bradtgmurray" - это правильно, но для компиляторов Visual C ++ вам в любом случае необходимо явно экспортировать вашу функцию.Но использование файла .DEF, предложенного "Serge - appTranslator", является неправильным способом сделать это.
Каков универсальный способ экспорта символов в Visual C ++ ?
Используя инструкцию declspec(dllexport/dllimport), которая работает как для кода C, так и для C ++, оформленного или нет (в то время как .DEF ограничен C, если только вы не хотите украсить свой код вручную).
Итак, правильный способ экспортировать недекорированные функции в Visual C ++ - это объединить идиому export "C", на которую отвечает "bradtgmurray", и ключевое слово dllimport / dllexport .
Пример ?
В качестве примера я создал на Visual C ++ пустой проект DLL и написал две функции, одну назвали CPP, потому что она была оформлена, а другую C, потому что она не была оформлена.Код является:
// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;
// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;
Я думаю, вы уже знаете, но для полноты картины макрос MY_DLL_API должен быть определен в файле DLL makefile (т.е.VCPROJ), но не пользователями DLL.
Код на C ++ легко написать, но для полноты картины я напишу его ниже:
// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
return 42 * v ;
}
extern "C"
{
// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
return 42 * v ;
}
} ;
Другие советы
Окружите определения функций внешним символом "C" {}
extern "C" {
void foo() {}
}
Видишь http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
Вы можете избежать всех искажений (C ++, cdecl, stdcall, ...) для экспортируемых функций, используя файл .def с разделом ЭКСПОРТА.Просто создайте файл MyDLL.def и добавьте его в свой проект:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
На самом деле, скорее всего, мастер уже создал для вас файл def.Вам просто нужно заполнить раздел ЭКСПОРТА.