Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> export статических переменных. При создании dll надо делать экспорт... 
:(
    Опции темы
Mastkir
Дата 16.10.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.5.2006

Репутация: нет
Всего: нет



Необходимо сделать динамическую библиотеку.

В одном классе объявлена статическая переменная. Пишу для класса
__declspec(dllexport). Получается примерно следующее:

  class __declspec(dllexport) A
  {
    ...
    static char* variable;
  }


В .сpp:
   char* A::variable;

Потом заменил на:
   __declspec(dllexport) char* A::variable;
, но все равно не помогло.

Вообще, в helpe написано, что для переменных (правда, для обычных, не статических) впереди еще extern писать надо. Но если где - то написать, то не компилируется. Да и потом, для класса я __declspec(dllexport) написал.

Ну а там, где библиотека используется, пишется:
  unresolved external symbol "public: static char* A::variable"

Как экспортировать переменную static, находящуюся внутри класса?
PM MAIL   Вверх
JackYF
Дата 16.10.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



А попробуй написать

Код

extern char* A::variable;


Там, где эта штука используется...

Хотя для меня все равно не ясно, почему стат. переменная, объявленная внутри класса, не экспортируется вместе с самим классом... smile 


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 16.10.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



надо писать с использованием директив препроцессора:
Код
...
#ifdef _DLL__
# define MYLIB_DECLSPEC __declspec(dllexport)
#else
# define MYLIB_DECLSPEC extern
#endif
...
MYLIB_DECLSPEC static char* A::variable;
...

PM   Вверх
Mastkir
Дата 16.10.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.5.2006

Репутация: нет
Всего: нет




 smile Хм... Оказалось, что статическая переменная variable вообще нигде не используется(я имею ввиду проект, куда добавлена эта библиотека).

Получается, статических переменных вообще не должно быть в классе для экспорта. smile  А жаль.
PM MAIL   Вверх
JackYF
Дата 16.10.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Mastkir, да как же это? Можешь использовать, просто в клиентский код добавь ту же самую .h- ку, в которой у тебя объявлены DLL-функции. В этот хедер добавь то, что сказал bsa, и все! Должно получиться!


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Mastkir
Дата 17.10.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.5.2006

Репутация: нет
Всего: нет



Все - таки статические переменные из dll в другом проекте использовать не удастся.

Оказалось, что экспортироваться-то она экспортировалась, но память под нее в новом проекте не выделена:
error LNK2001: unresolved external symbol "public: static int A::variable" (?test1@A@@2HA)

(для выделения памяти под статические переменные ее следует повторно объявить в модуле компиляции, в котором она будет использоваться, т.е. int A::variable). 

Если сделать это еще раз в клиентском коде, то получается, что библиотека работает с одной памятью для нее, а приложение - с другой.
(Она все - таки используется в приложении).

Написав тестовый пример(я так и сделал), можно убедиться, что экспорт проходит удачно, однако память оказалась разная.
PM MAIL   Вверх
bsa
Дата 17.10.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Тогда закрой эту переменную статическими методами Set/Get и работай через них.
PM   Вверх
Vyacheslav
Дата 17.10.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Если работаешь с VS, то в этом случае нужно указать соответственно модель
Multithread DLL, чтобы память была одна



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.