Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Link error LNK2005


Автор: Superklug 8.6.2010, 10:15
Доброго времени суток!

Есть задача написать 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. Буду признателен, если подскажите какую-нибудь литературу...

Автор: Dem_max 8.6.2010, 10:21
Цитата

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

Угу придется

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

Автор: Superklug 8.6.2010, 10:38
Цитата(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)

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

Как этого избежать?

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

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

Моя библиотека динамическая (dll), но она использует статические (lib).

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

Автор: Superklug 8.6.2010, 12:12
Alexeis, а как же вот это: http://support.microsoft.com/kb/140584?
На сколько я понял для 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:54
А обязательно при создании DLL указывать Runtime Library как Multi-threaded Debug DLL (/MDd)? Что будет если выбрать Multi-threaded Debug (/MTd)?


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

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

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

Автор: Superklug 9.6.2010, 07:52
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)

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

Автор: Alek86 9.6.2010, 22:19
Superklug, может, extern templates поможет

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

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

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

Всем спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)