Есть ли способ подавления искажения имени в c ++? - PullRequest
5 голосов
/ 24 мая 2009

У меня есть DLL, написанная на C ++, и я хочу подавить искажение имени для нескольких экспортируемых методов. Методы являются глобальными и не являются членами какого-либо класса. Есть ли способ добиться этого?

Кстати: я использую VS2008.

Ответы [ 3 ]

25 голосов
/ 24 мая 2009

Окружить определения функций внешним "C" {}

extern "C" {
    void foo() {}
}

См. http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

10 голосов
/ 26 мая 2009

«bradtgmurray» - это правильно, но для компиляторов Visual C ++ вам все равно нужно явно экспортировать вашу функцию. Но использование файла .DEF, предложенного "Serge - appTranslator", является неправильным способом сделать это.

Каков универсальный способ экспорта символов в Visual C ++?

Использование инструкции declspec (dllexport / dllimport), которая работает как для кода на C, так и на C ++, независимо от того, оформлены они или нет (тогда как .DEF ограничен C, если вы не хотите украшать свой код вручную).

Таким образом, правильный способ экспорта неокрашенных функций в Visual C ++ - это сочетание идиомы экспорта "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 должен быть определен в make-файле DLL (т.е. 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 ;
}

} ;
10 голосов
/ 25 мая 2009

Вы можете избежать всех искажений (C ++, cdecl, stdcall, ...) для экспортируемых функций, используя файл .def с разделом EXPORTS. Просто создайте файл MyDll.def и добавьте его в свой проект:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

На самом деле, скорее всего, волшебник уже создал файл def для вас. Вам просто нужно заполнить раздел ЭКСПОРТ.

...