Проблема экспорта символов с использованием __declspec (dllexport) - PullRequest
2 голосов
/ 19 марта 2010

Я использую __declspec (dllexport) с несколькими методами в библиотеке.Но один из символов не экспортируется должным образом.Соответствующее значение называется «перезагрузка».Ниже приведен вывод файла dumpbin.exe:

1    0 0002DB27 ev_err = @ILT+2850(_ev_err)
          2    1 0002DADC m_foutput = @ILT+2775(_m_foutput)
          3    2 0002D361 m_free = @ILT+860(_m_free)
          4    3 0002D505 m_free_vars = @ILT+1280(_m_free_vars)
          5    4 0002D055 m_get = @ILT+80(_m_get)
          6    5 0002D95B m_ident = @ILT+2390(_m_ident)
          7    6 0002D80C m_inverse = @ILT+2055(_m_inverse)
          8    7 0002D0F5 m_mlt = @ILT+240(_m_mlt)
          9    8 0002D339 m_ones = @ILT+820(_m_ones)
         10    9 0002D43D m_rand = @ILT+1080(_m_rand)
         11    A 0002DC3F m_resize = @ILT+3130(_m_resize)
         12    B 0002D465 m_zero = @ILT+1120(_m_zero)
         13    C 0002D3A7 px_foutput = @ILT+930(_px_foutput)
         14    D 0002DA2D px_free = @ILT+2600(_px_free)
         15    E 00092DE0 restart = _restart
         16    F 0002DB45 set_err_flag = @ILT+2880(_set_err_flag)
         17   10 0002D550 v_foutput = @ILT+1355(_v_foutput)
         18   11 0002D839 v_free = @ILT+2100(_v_free)

Это указывает на то, что перезапуск не был правильно экспортирован, но я не могу понять, почему.следующая строка для экспорта переменной:

extern  __declspec(dllexport) jmp_buf   restart;

В чем причина этой аномалии и как я могу ее устранить?

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Это потому, что ваш идентификатор перезапуска - это данные, а не код. Вероятно, он должен был называться restart_state. Экспорт данных из DLL является поддерживаемым сценарием, но хорошим способом отмахнуться. Код клиента должен иметь строгую двоичную совместимость с кодом DLL. Это очень сомнительное предложение для setjmp (), сохраненное состояние сильно зависит от реализации.

Вам гораздо выгоднее экспортировать функции, которые делают вызовы setjmp () и longjmp () и поддерживают конфиденциальность jmp_buf. * ​​1003 *

0 голосов
/ 19 марта 2010

У вас должен быть атрибут dllexport в определении и объявлении. Определение - это исходный файл, в котором вы задали «перезагрузку» без ключевого слова extern.

...