Помогите побороть следующую беду: написал свою библиотечку (.lib) c набором мелких функций, использующихбтолько RTL и STL, без всякого GUI. Теперь создаю консольный проект, подключаю библиотеку и на линковке вижу штук 70 ошибок типа "symbol already defined in module xxx.obj", в большинстве вокруг STL'евского string'a. В основном, дело касалось msvcprtd.lib и еще какой-то библиотеки, типа VClib или что-то в этом роде. Вторую я выкинул (ignore library) — все нормально, первую отключаю — ошибок еще больше — не найены _atexit, _abort..., весь IOstream и т.д. и т.п, так как в моей библиотеке я их не использовал, а стандартную отключил.
Вот так, точнее и не так и не эдак
После долгих мучений я приписал ключ FORCE:MULTIPLE, лишь бы только собрать проект. Проект собрался, но, естественно, с Warnings.
LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/FORCE' specification
msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(class std::basic_string,class std::allocator > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: char const * __thiscall std::basic_string,class std::allocator >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
Debug/grmc.exe : warning LNK4088: image being generated due to /FORCE option; image may not run
Видеть каждый раз при сборке очень неприятно, тем более вот ту строчку про "image nay not run", ободряюще звучит....
Может, кто че расскажет про то как правильно работать с библиотеками? Не для конкретного случая, хотя бы в общих словах. Этот геморрой я помню еще с DOS'a, время идет а он остается
Ja ispolzuju STL v lib'ah mnogo i uspeshno. Jedinstvennaja problema — pered pervoj sborkoj programmy nado ubeditsia chto vse moduli ispolzujut odnu i tu ze MSVCRT: opcii /M iz Project Settings — C/C++ — Project Options.
Здравствуйте Roman Fadeyev, Вы писали:
RF>Ну, тут уж мне точно никто не поможет :(
У нас помогут везде! И если окажемся неправы, то признаем ошибку и постараемся её исправить. :shiffle:
RF>PS. А чем, собственно, форум С++ не подошел? Вроде все в тему.... Прячете безответные вопросы ;)
Нет, безответные вопросы прятать нет смысла -- так быстрее ответят, если они будут лежать у всех на виду. И лучше уж пусть ответят.
По поводу переноса. Может я перебрал в том, что перенёс топик :-\ , не серчайте. Полагаясь на ваше с DarkGray мнение, позволю себе перекинуть топик обратно и поднять его наверх этим сообщением.
Хочу также напомнить, что есть самомодерилка и с её помощью и поддержкой нескольких человек Вы (все посетители) можете исправить и моё неверное решение. :user:
Здравствуйте Хитрик Денис, Вы писали:
ХД>Здравствуйте Roman Fadeyev, Вы писали:
RF>>Ну, тут уж мне точно никто не поможет
ХД>У нас помогут везде! И если окажемся неправы, то признаем ошибку и постараемся её исправить. :shiffle:
RF>>PS. А чем, собственно, форум С++ не подошел? Вроде все в тему.... Прячете безответные вопросы
ХД>Нет, безответные вопросы прятать нет смысла -- так быстрее ответят, если они будут лежать у всех на виду. И лучше уж пусть ответят.
ХД>По поводу переноса. Может я перебрал в том, что перенёс топик , не серчайте. Полагаясь на ваше с DarkGray мнение, позволю себе перекинуть топик обратно и поднять его наверх этим сообщением. ХД>Хочу также напомнить, что есть самомодерилка и с её помощью и поддержкой нескольких человек Вы (все посетители) можете исправить и моё неверное решение.
SH>Кстати, а зачем тебе либы? ИМХО, лучше или dll или open source. И основная причина моей неприязни к либам — вставшая перед тобой проблема.
Дело в том, что подобные либы — вещь чрезвычайно легкая (в смысле, в килобайтах), делать под это дело DLL — нет смысла, будет куча мелких DLL, без всякой пользы. Ну а open source — плохо в эстетическом плане , дерево проекта напоминает свалку. Сами подумайте, если, к примеру, в это же дерево добавить MFС, здорово ли Вам будет работать? Вот и надумал я сделать маленькие либы для разных задачек — функции-утилиты, мелочи по GUI, потом, функции разбора текста и т.д. и т.п. Если какая нужна- хидер вписал, либу воткнул — и пжлста.
Здравствуйте Roman Fadeyev, Вы писали:
RF>Привет всем.
RF> Помогите побороть следующую беду: написал свою библиотечку (.lib) c набором мелких функций, использующихбтолько RTL и STL, без всякого GUI. Теперь создаю консольный проект, подключаю библиотеку и на линковке вижу штук 70 ошибок типа "symbol already defined in module xxx.obj", в большинстве вокруг STL'евского string'a. В основном, дело касалось msvcprtd.lib и еще какой-то библиотеки, типа VClib или что-то в этом роде. Вторую я выкинул (ignore library) — все нормально, первую отключаю — ошибок еще больше — не найены _atexit, _abort..., весь IOstream и т.д. и т.п, так как в моей библиотеке я их не использовал, а стандартную отключил.
RF> Вот так, точнее и не так и не эдак
RF>После долгих мучений я приписал ключ FORCE:MULTIPLE, лишь бы только собрать проект. Проект собрался, но, естественно, с Warnings.
RF>
RF>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/FORCE' specification
RF>msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
RF>msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
RF>msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(class std::basic_string,class std::allocator > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
RF>msvcprtd.lib(MSVCP70D.dll) : warning LNK4006: "public: char const * __thiscall std::basic_string,class std::allocator >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) already defined in crtlibd.lib(BaseUtils.obj); second definition ignored
RF>Debug/grmc.exe : warning LNK4088: image being generated due to /FORCE option; image may not run
RF>
RF>Видеть каждый раз при сборке очень неприятно, тем более вот ту строчку про "image nay not run", ободряюще звучит....
RF>Может, кто че расскажет про то как правильно работать с библиотеками? Не для конкретного случая, хотя бы в общих словах. Этот геморрой я помню еще с DOS'a, время идет а он остается
RF>Еще есть мое сообщение про "also imported" на http://www.rsdn.ru/forum/message.asp?mid=21229
, с которым тогда так и не разобрались, может, кто сейчас поможет, задолбали меня уже эти варнинги
Я бы хотел посмотреть твой исходник самой библиотеки.
Но могу предположить что ты где то в HPP файле уже определил какуюто переменную или в реализаии класса.
В HPP файлах использую extern, а определяй в CPP (может и глупость сказал и ты это знаеш но это
очень распространенная ошибка).
Здравствуйте Whisperer, Вы писали:
W>Я бы хотел посмотреть твой исходник самой библиотеки. W>Но могу предположить что ты где то в HPP файле уже определил какуюто переменную или в реализаии класса. W>В HPP файлах использую extern, а определяй в CPP (может и глупость сказал и ты это знаеш но это W>очень распространенная ошибка).
Не-а, я вообще не использую никаких глобальных объектов
А вот STL что-там использует. Понять бы что....
Прикол в том, что прилинковывается msvcprtd.lib(MSVCP70D.dll) и не ладит с crtlibd.lib.
msvcprtd.lib(MSVCP70D.dll) .... __thiscall std::basic_string .... already defined in crtlibd.lib(BaseUtils.obj);
Здравствуйте SergH, Вы писали:
SH>Здравствуйте Roman Fadeyev, Вы писали:
RF>> Ну а open source — плохо в эстетическом плане , дерево проекта напоминает свалку.
SH>Если проблема только в этом, решение есть — в дереве проекта можно создавать дополнительные фолдеры.