Вопрос

У меня есть 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.Вам просто нужно заполнить раздел ЭКСПОРТА.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top