Visual C ++: экспорт имени оформленной функции в файл определения - PullRequest
2 голосов
/ 14 сентября 2011

Я хочу экспортировать оформленное имя функции в файл определения, например так:

LIBRARY Example
EXPORTS
??0__non_rtti_object@std@@QAE@ABV01@@Z=myfunc @1

Проблема в том, что компоновщик разбирает имя функции в первом @ -sign и ставит просто «?? 0__non_rtti_object"в таблицу экспорта.Мой вопрос сейчас, есть ли способ также включить @ -символы?Я использую Visual Studio 2010. Может быть, есть кто-то, кто может мне помочь.

Заранее спасибо, Ханнес.

1 Ответ

3 голосов
/ 14 сентября 2011

Преамбула

Вы не ответили на мой комментарий об использовании файла .DEF, поэтому я предполагаю, что вы не знакомы с квалификаторами dllexport и dllimport. С ними нет необходимости экспортировать символы в файл .DEF.

Если существует особая необходимость в файле .DEF, который делает недействительным использование функции dllimport / dllexport, игнорируйте следующее.

Как использовать dllimport / dllexport?

В вашем публичном заголовке (скажем, public.hpp) напишите что-то вроде:

#ifdef MY_PROJECT_EXPORTS
   #define MY_PROJECT_API __declspec(dllexport)
#else
   #define MY_PROJECT_API __declspec(dllimport)
#endif

Таким образом, макрос MY_PROJECT_API включит экспорт / импорт ваших символов. Например, позже, в том же public.hpp, вы можете объявить:

// A global variable
MY_PROJECT_API int myGlobalVariable ;

// A function
MY_PROJECT_API void my_function() ;

// A class or struct
class MY_PROJECT_API MyClass
{
   public :
      int i;
      virtual int foo() ;
      // etc.
} ;

Затем, в параметрах проекта вашей библиотеки вам нужно определить MY_PROJECT_EXPORTS: таким образом, когда вы компилируете свою библиотеку, символы выше объявляются dllexport, и когда кто-то еще включает ваш public.hpp заголовок, символы выше будут dllimport

И если ваш код кроссплатформенный (dllimport / dllexport - это функция компилятора MS), просто оберните приведенные выше определения вокруг теста компилятора. Например:

#ifdef _MSC_VER
   // For MS Visual Studio
   #ifdef MY_PROJECT_EXPORTS
      #define MY_PROJECT_API __declspec(dllexport)
   #else
      #define MY_PROJECT_API __declspec(dllimport)
   #endif
#else
   // For other compilers
   #define MY_PROJECT_API
#endif

О файле .DEF?

.DEF-файл использовался до , когда экспортируемые функции C все еще находились в процессе разработки в Visual Studio.

Для строгой безопасности типов C ++ украшает свои символы.

Недостатком является то, что у каждого компилятора есть своя собственная схема оформления (что никогда не беспокоило меня за 12 лет разработки), и что поиск точного, украшенного имени символа не может быть болезненным.

Но достоинства этого таковы:

  1. Теперь вы можете экспортировать перегруженные / именованные функции / символы
  2. типы параметров являются частью ABI, то есть компоновщик может проверить, что вы не испортили или не изменили своим типам

Функции dllimport и dllexport имеют следующие преимущества:

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

Источники

Для получения дополнительной информации см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...