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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Link error LNK2005 
V
    Опции темы
Superklug
Дата 8.6.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток!

Есть задача написать dll в которой были бы реализованы некоторые методы обработки изображений. 
За основу взял библиотеку GraphicsMagick. Собрал ее как Static Multi Thread. Соответственно к моему проекту подключены *.lib библиотеки.
При попытке сборки, линкер выдает ряд ошибок: error LNK2005: *** already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib.
Долго разбирался с настройками проекта, но так ничего и не вышло.
На сколько я понимаю возникает конфликт между разными версиями CRT библиотек. Т.е. библиотеки GraphicsMagick используют LIBCMT, а моя библиотека - MSVCRTD... Выходит нельзя собрать DLL которая использует статические библиотеки?
Если собрать GraphicsMagick как DLL, то все полученные *.dll файлы придется тащить вместе с моей библиотекой?

Пожалуйста помогите разобраться...

P.S. и еще... У меня нет опыта в создании DLL. Буду признателен, если подскажите какую-нибудь литературу...

PM MAIL   Вверх
Dem_max
Дата 8.6.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Цитата

Если собрать GraphicsMagick как DLL, то все полученные *.dll файлы придется тащить вместе с моей библиотекой?

Угу придется


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexeis
Дата 8.6.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Superklug, может название одной из функций совпадет с именем функции из CRT? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Superklug
Дата 8.6.2010, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alexeis @  8.6.2010,  10:24 Найти цитируемый пост)
Superklug, может название одной из функций совпадет с именем функции из CRT?  

Нет... В ошибках фигурируют функции _exit, __malloc_dbg и т.п.

Не знаю правильно ли я сделал, но в настройках проекта указал игнорирование LIBCMTD.lib.
Вроде теперь конфликта между MSVCRTD и LIBCMTD не возникает.

Однако есть еще ряд ошибок линкера, причину возникновения которых я не знаю(
Код

msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string ... already defined in CORE_DB_Magick++_.lib(Color.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string ... already defined in CORE_DB_Magick++_.lib(Exception.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string ... already defined in CORE_DB_Magick++_.lib(Image.obj)

Наверно проблема связана с шаблонными классами и функциями. Т.е. несколько раз генерируется одинаковый код для шаблонов с одинаковыми параметрами...

Как этого избежать?
PM MAIL   Вверх
Alexeis
Дата 8.6.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Superklug, я чет туплю. У тебя либа статическая совсем (только lib без dll)? Или динамическая, но подключается статически через lib файл (секцию экспорта).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Superklug
Дата 8.6.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alexeis @  8.6.2010,  11:45 Найти цитируемый пост)
Superklug, я чет туплю. У тебя либа статическая совсем (только lib без dll)? Или динамическая, но подключается статически через lib файл (секцию экспорта). 

Моя библиотека динамическая (dll), но она использует статические (lib).
PM MAIL   Вверх
Alexeis
Дата 8.6.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Superklug, статические либы ни что иное как собранные obj файлы, так что CRT у lib и у проекта который подключает ее должен совпадать. Может разве что отличаться debug/Release CRT


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Superklug
Дата 8.6.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, а как же вот это: ссылка?
На сколько я понял для dll и lib разные библиотеки...

Ну я надеюсь эта проблема решилась игнорированием одной из конфликтующих библиотек.
А что на счет этого:
Цитата(superklug)

Однако есть еще ряд ошибок линкера, причину возникновения которых я не знаю(
Без подсветки
1:
2:
3:
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string ... already defined in CORE_DB_Magick++_.lib(Color.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string ... already defined in CORE_DB_Magick++_.lib(Exception.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string ... already defined in CORE_DB_Magick++_.lib(Image.obj)

Наверно проблема связана с шаблонными классами и функциями. Т.е. несколько раз генерируется одинаковый код для шаблонов с одинаковыми параметрами...


Это сообщение отредактировал(а) Superklug - 8.6.2010, 12:14
PM MAIL   Вверх
Superklug
Дата 8.6.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А обязательно при создании DLL указывать Runtime Library как Multi-threaded Debug DLL (/MDd)? Что будет если выбрать Multi-threaded Debug (/MTd)?


Возможно я с самого начала неправильно использую библиотеки GraphicsMagick?
Как нужно собрать эти библиотеки, чтобы на их основе сделать свою динамическую библиотеку? Нужно получить именно 1 файл *.dll.

Это сообщение отредактировал(а) Superklug - 8.6.2010, 13:25
PM MAIL   Вверх
Alexeis
Дата 8.6.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Superklug @  8.6.2010,  11:54 Найти цитируемый пост)
А обязательно при создании DLL указывать Runtime Library как Multi-threaded Debug DLL (/MDd)? Что будет если выбрать Multi-threaded Debug (/MTd)?

  Запросто. Я у себя всегда использую только MTd. Размер немного раздувается, но зато ничего не нужно за собой тащить. Важно, чтобы статическая либа, которая подключается к DLL нашла все необходимые символы.  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Superklug
Дата 9.6.2010, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alexeis, а что на счет этих ошибок?
Код

msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Exception.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Color.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Color.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Exception.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Exception.obj)
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "class std::basic_string<char, ... already defined in CORE_DB_Magick++_.lib(Image.obj)


Это сообщение отредактировал(а) Superklug - 9.6.2010, 07:53
PM MAIL   Вверх
Alexeis
Дата 9.6.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Superklug, уточните все таки, указанные ошибки получаются когда lib файл и dll компилируются с одинаковым RTL или все так с разными? Компилятор тот же самый? Может отличаются некоторые другие опции проекта. Или скажем заголовочные файлы менялись после того как компилировалась либа.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alek86
Дата 9.6.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Superklug, может, extern templates поможет

Это сообщение отредактировал(а) Alek86 - 9.6.2010, 22:20


--------------------
user posted image    user posted image
PM MAIL   Вверх
Superklug
Дата 18.6.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ошибки были как с разными версиями RTL так и с одинаковыми (/MTd)...
Настройки проектов одинаковые, компилятор один и тот же.

Удалось решить проблему выставив в качестве RTL - Multi-threaded Debug DLL для библиотек GM и для моей библиотеки.
Пока не могу оценить правильность работы. Но библиотека хотя бы собирается...

Осталось только пара предупреждений. Пока не могу понять причину их возникновения, но думаю разберусь.

Всем спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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