2013-02-26 2 views
6

Я написал DLL-библиотеку с большим количеством функций и классов в Visual Studio 2010. Когда я смотрю на содержимое файла с:имена функций DLL с помощью dumpbin.exe

dumpbin.exe /EXPORTS myDll.dll 

я долго имена функций с какой-то указатель функции местоположения, которая выглядит, как этот (второй вход в .dll):

  2 1 0001100A [email protected]@[email protected]@[email protected] = @ILT+5([email protected]@[email protected]@[email protected]) 

Это как-то трудно читать, но я видел «приятнее» список процедуры/функции от другой. dll-s, например:

141 8C 00002A08 PogoDbWriteValueProbeInfo 

Как я могу сделать этот .dll список таким же?

P.S .: мой исходный код DLL выглядит следующим образом:

namespace codecX 
{ 
    class codec 
    { 
     public: 
     static __declspec(dllexport) double Initialize(double a, double b); 
     ... 
+1

Вы действительно хотите экспортировать unmangled names? Если вы это сделаете, вы не сможете использовать перегрузку функций. Похоже, вы экспортируете класс C++. Вы экспортируете методы экземпляра, конструкторы и т. Д. Или все ваши методы статичны? –

+1

http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

Дэвид Х., да, мое намерение заключалось в том, чтобы экспортировать удобочитаемый формат. Зачем? Мне нужно передать созданный .dll другим сотрудникам и иметь читаемый формат, который необходим для хорошего понимания исходного кода и/или библиотек, написанных кем-то другим. :) – TomiL

ответ

7

Вам нужно тянуть эти статические функции в глобальное адресное пространство, а затем обернуть их экстерном «C». Это будет подавлять ++ имя коверкая C и вместо того, чтобы дать вам C имя коверкая, который менее уродливой:

extern "C" __declspec(dllexport) Initialize(double a, double b) 
{ 
    codec::Initialize(a, b); 
} 

, а затем удалить __declspec (dllexport) на ваших статических функций-членов:

class codec 
{ 
    public: 
     static double Initialize(double a, double b); 
} 
+0

Джон, спасибо за ваш ответ! Это решило мою проблему! – TomiL

3

Это называется name-mangling и происходит, когда вы скомпилируете C++ с компилятором C++. Чтобы сохранить «удобочитаемые» имена, вам нужно будет использовать extern "C" при объявлении и определении ваших классов и ваших функций. т.е.

extern "C" void myFunction(int, int); 

См here, а также Google mixing C and C++.

+0

Вы покрыли mangling, но упустили упоминание об украшении –

+0

@DavidHeffernan Согласитесь, я забыл об этом, ладно;)? Но вы правы, конечно. –

+0

Bash.d, спасибо за ваш ответ! Это то, что мне нужно! – TomiL

Смежные вопросы