Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 | ||
Угу придется |
Автор: Alexeis 8.6.2010, 10:24 |
Superklug, может название одной из функций совпадет с именем функции из CRT? |
Автор: Alexeis 8.6.2010, 11:45 |
Superklug, я чет туплю. У тебя либа статическая совсем (только lib без dll)? Или динамическая, но подключается статически через lib файл (секцию экспорта). |
Автор: Superklug 8.6.2010, 11:51 | ||
Моя библиотека динамическая (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 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 | ||
Запросто. Я у себя всегда использую только MTd. Размер немного раздувается, но зато ничего не нужно за собой тащить. Важно, чтобы статическая либа, которая подключается к DLL нашла все необходимые символы. |
Автор: Superklug 9.6.2010, 07:52 | ||
Alexeis, а что на счет этих ошибок?
|
Автор: 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 и для моей библиотеки. Пока не могу оценить правильность работы. Но библиотека хотя бы собирается... Осталось только пара предупреждений. Пока не могу понять причину их возникновения, но думаю разберусь. Всем спасибо за помощь! |