Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: загвоздка со static  (Прочитано 12624 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 06-03-2009 10:26 » 

я где-то промахнулась, но не пойму где...
Ситуация следующая:
есть 3 dll-ли, использующие много похожего кода, поэтому код был заблаговременно выделен в отдельную статическию lib (там был создан класс, в который и был помещен код). Все функции были сделаны static.
Туда же (но уже вне класса) были перенесены макросы для написания лога.

В связи с этим мне понадобилось в макросах заменить конкретное указание имени файла, который пишет что-то в лог, на какую-то переменную.
Не мудрствуя лукаво, я решила вопрос следующим образом:
в классе объявила
Код:

public:
static void setFileNames( char* pFileDll, char* pFileTest );

static char* getFileDll();
static char* getFileTest();

private:

static char m_sFileDll[128];
static char m_sFileTest[128];


Ну и напоследок в макросах стоит вот что:

Код:
   MBT_PRINT_ERROR_OMS_HLP( message, err, MBTestHelper::getFileTest());	

Статическая либа скомпилировалась на ура.
После этого я полезла в dll-лю и написала:

Код:
MBTestHelper::setFileNames( "OMSp_MBT_ComposTest.cpp", "MBTestCaseCompos.cpp" );

И вот тут получила при компиляции погонами следующую ошибку:

Код:
1>OMSp_MBT_HelpLib.lib(helper.obj) : error LNK2001: unresolved external symbol "private: static char * MBTestHelper::m_sFileTest" (?m_sFileTest@MBTestHelper@@0PADA)
1>OMSp_MBT_HelpLib.lib(helper.obj) : error LNK2001: unresolved external symbol "private: static char * MBTestHelper::m_sFileDll" (?m_sFileDll@MBTestHelper@@0PADA)

Никак не пойму, что я упустила...
Сразу оговорюсь - все остальные функции вызываются без проблем.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #1 : 06-03-2009 11:28 » 

на первый взгляд:

1) не добавлен хедер
2) файл *.cpp, где описан MBTestHelper, не вкючен в дерево проекта
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 06-03-2009 12:48 » 

Может lib не указана для линкера, и dll собирается без lib?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 06-03-2009 13:15 » 

Леш, Дим,

с этим все в порядке. all inclusive Ага
В этом классе порядка 10 функций и все они компилируются и затем вызываются при выполнении dll-ли без проблем.
Проблема возникла тогда, когда я добавила эти 2 строки + соответствующие им функции... Поэтому и думаю, что тут где-то загвоздка в static - я что-то для них не сделала, а что - убей не пойму...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 06-03-2009 13:35 » 

Сам сталкивался несколько раз, когда либа которую подхватывает компилятор при компиляции всего проекта и либа, в которую он откомпилирует твой класс  это два разных файла в разных директориях. Это также может быть как результат других условий компиляции у двух подпроектов (Debug или Release).
« Последнее редактирование: 06-03-2009 13:39 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 06-03-2009 15:42 » 

Finch,

а как с этим бороться? Выглядит совсем грустно...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 06-03-2009 16:28 » 

Два пути, которые я вижу.
1) Не забывать, после каждой компиляции прокопировать соответствующие файлы в соответствуюшие директории.
2) Постараться указать  абсолютные пути, к либам, как при компиляции библиотеки, так и при компиляции основного проекта.
Первый путь -  легкий в исполнении, но с постоянными головными болями. Второй путь требует настройки проетка.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #7 : 06-03-2009 16:51 » 

Тогда попробовать GetProcAddress - доставать функцию ил dll и использовать


Ирин, а можешь проект прикрепить ?
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 06-03-2009 16:55 » 

мдя, второй не катит вообще - мы не имеем права указывать абсолютный путь, т.к. работаем с системой clearcase и у  нас постоянно меняются т.н. view.
С первым  - сейчас посмотрю. Но вроде бы все объектные файлы и либы на месте...
Просто барабашки какие-то...

Леш,

статическая библиотека прикрепляется к dll-лю в момент линковки. Тит смысл был именно в статическом соединении.
А мою dll-лю потом вызывает главное приложение - вот там таки динамическая загрузка.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 06-03-2009 18:11 » new

Ирин смотри, Файл который подхватывает компилятор при линковке скорее всего будет лежать в главной директории проекта или может быть из Release(Debug)\. А тот который ты получаеш от компиляции подпроекта, скорее всего будет лежать YourSubProject\Release(Debug). Отсюда и могут расти ноги.
« Последнее редактирование: 06-03-2009 18:14 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 09-03-2009 10:01 » 

Ребята, усе. Нашла причину - я забыла проинициализировать эти несчастные переменные... Спасибо коллеге - увидев ошибку, сразу же указал на ошибки Ага Сказал, что на днях сам с этим столкнулся - в запарке забыл именно эту операцию также, как и я Ага
Так что не хватило всего лишь 2 строк в .cpp:
Код:
char MBTestHelper::m_sFileDll[128] = { 0 };
char MBTestHelper::m_sFileTest[128] = { 0 };

Всем спасибочки! И извините за беспокойство  Скромно так...  С ума сойти...


Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines