Ошибка компоновщика MSVC 2010 2005 с std :: cout в статической библиотеке - PullRequest
3 голосов
/ 08 января 2011

Я нашел другие примеры людей, имеющих эту проблему, но им не повезло с их решениями. Я пытаюсь использовать std :: cout в статической библиотеке, которая также использует потоки boost и bind. Когда я не использую и std::cout, он прекрасно компилируется и связывается с основной программой, но когда я делаю и компилирую библиотеку, у меня нет проблем, но когда я компилирую и связываю основную программу, использующую статическую библиотеку, я получаю массу таких вещей, как:

2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj)

и т.д ...

Я попытался зайти в настройки своего компоновщика и не использовать конфликтующую библиотеку, указанную в выводе ошибки, но не могу понять, что это правильно. Если я скажу, чтобы он прекратил использовать одну библиотеку, это могло бы решить проблемы, но я дал бы несколько недостающих внешних символов, тогда я переключил бы библиотеку, с которой были проблемы, но я все еще получаю несколько «уже определенных». Любые подсказки, что я могу сделать, чтобы это исправить? Должен ли я просто создать другой класс с именем «log» или что-то в этом роде и просто получить к нему доступ из основного файла .exe (который будет использовать библиотеку строк, что может снова вызвать проблемы, но я еще не пробовал)? Спасибо за любую помощь.

Ответы [ 3 ]

9 голосов
/ 08 января 2011

Попробуйте проверить -> Проект + Свойства, C / C ++, Генерация кода, Библиотека времени выполнения.Ваш .lib и ваш основной проект должны использовать одну и ту же настройку здесь.

3 голосов
/ 08 января 2011

Щелкните правой кнопкой мыши свой проект, Свойства, C / C ++, Генерация кода, Настройка библиотеки времени выполнения.Это источник вашей проблемы.Настройки есть / MT и / MD.Вы связываете код с конфликтующими значениями для этого параметра, все должно быть скомпилировано с одним и тем же.

Может быть Boost.Проверьте настройку дополнительных зависимостей вашего компоновщика.IIRC, в именах .lib есть mt или md.

2 голосов
/ 08 января 2011

LNK2005 происходит, когда два объекта компиляции содержат одинаковые символы.Когда вы пытаетесь связать их вместе, компоновщик не знает, что делать с тем фактом, что у него есть дубликаты всего, отсюда и ошибка.

В частности, это звучит так, как будто ваша статическая библиотека lib / возможно, повышение былоскомпилировано с /MT, которое статически связывает среду выполнения MSVC.Похоже, вы пытаетесь скомпилировать свой код с параметрами по умолчанию (/MD, динамическая ссылка на MSVCR100.DLL, MSVCP100.DLL).

См. http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx

Вы можетеЛибо перестройте указанную статическую библиотеку, убедившись, что она связана с динамическими библиотеками, либо попробуйте статически связать ваш код.

Я должен добавить, что D в конце означает просто отладку.то есть MSVCP100D.DLL является отладочной версией MSVCP100.DLL.

...