Ошибки компоновщика между несколькими проектами в Visual C ++ - PullRequest
11 голосов
/ 03 марта 2009

У меня есть решение с несколькими проектами. У меня есть «основной» проект, который действует как меню, и оттуда пользователь может получить доступ к любому из других проектов. В этом основном проекте я получаю ошибки компоновщика для каждой вызванной функции. Как мне избежать этих ошибок компоновщика? Я установил зависимости проекта уже в диалоговом окне «Зависимости проекта ...».

Спасибо

РЕДАКТИРОВАТЬ - я сделал, как предлагалось, и добавил папку вывода в дополнительные каталоги компоновщика. Теперь, однако, я получаю миллион ошибок следующим образом:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)

Ответы [ 9 ]

20 голосов
/ 03 марта 2009

Трудно ответить, не зная всех подробностей о вашем решении, но я предполагаю, что ваш "другой" проект настроен на создание файла .lib, и основной проект затем связывает все эти файлы lib. Если это так, то возможной причиной ошибок, которые вы получаете, является то, что ваши проекты ссылаются на разные версии библиотеки времени выполнения.

Из Документация Microsoft , "Все модули, переданные для данного вызова компоновщика, должны быть скомпилированы с одним и тем же параметром компилятора библиотеки времени выполнения (/ MD, / MT, /LD)."

Попробуйте изменить все проекты, чтобы использовать одну и ту же версию библиотеки времени выполнения. В Visual Studio 2010 это находится в свойствах проекта | Свойства конфигурации | C / C ++ | Генерация кода | Библиотека времени исполнения. Выберите Многопоточная отладочная DLL или Многопоточная отладка (для конфигурации отладки).

11 голосов
/ 03 марта 2009

Не зная каких-либо подробностей о вашем решении, трудно сказать, однако Rebuild All может оказаться полезным. Такая ситуация может иногда возникать, когда существуют смешанные объектные файлы для разных архитектур.

Возможно, вы захотите использовать «Ссылки» вместо «Зависимости»

EDIT:

После того, что вы опубликовали, кажется, что ваша связь со стандартными библиотеками противоречива. Может ли быть так, что один из проектов статически связывает стандартные библиотеки, а другие динамически? (См. Свойства проекта-> компоновщик) Или один для времени выполнения релиза, а другие для отладки? (хотя последнее должно быть возможно с оговорками)

2 голосов
/ 03 марта 2009

Экспортируются ли функции в других ваших проектах? Если они не экспортируются, то не из чего делать ссылки из основного exe-файла, так что это может привести к ошибкам. См. Экспорт из DLL. Для получения дополнительной информации используйте __declspec (экспорт) .

1 голос
/ 01 апреля 2010

Вы получаете следующие ошибки: «error LNK2005», где символ в библиотеке, которую вы связываете (msvcprtd.lib), уже определен в другой библиотеке (например, Panel.lib). Если вы добавите Panel.lib в поле «Игнорировать определенную библиотеку» (в Свойствах конфигурации VS2008 -> Линкер -> Ввод -> Игнорировать определенные библиотеки), ошибки прекратятся.

0 голосов
/ 09 ноября 2018

В моем случае у меня есть два метода:

  1. Свойства проекта -> C / C ++ -> Генерация кода -> Библиотека времени выполнения. измените его на MT.

  2. Добавьте вашу библиотеку недостатков в: Линкер-> Ввод -> Дополнительные зависимости. Если это не работает, попробуйте добавить полный путь вместо имени библиотеки.

Например: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

Это работает для меня. Ответьте на этот вопрос, кому нужна помощь.

0 голосов
/ 01 марта 2013

В моем случае проблема заключалась в том, что я сохранил прототипы функций, определения классов и реализацию функций и реализацию классов в одном файле cpp. Только когда я переместил объявления и прототипы в отдельный заголовочный файл, эти ошибки исчезли. Действительно странно!

0 голосов
/ 06 декабря 2012

Точно, по крайней мере, один из ваших проектов скомпилирован с «Runtime Library», отличной от других. Может быть, вы добавили новый, используя по умолчанию, который отличается. Проверьте свойства вашего проекта (-ов) на наличие равных значений «Свойства конфигурации» -> «C / C ++» -> «Генерация кода» -> «Библиотека времени выполнения».

0 голосов
/ 12 мая 2011

У меня была очень похожая проблема, которая возникла из-за того, что в одной из моих библиотек для параметра 'Обрабатывать wchar_t как встроенный тип' было установлено другое значение. Этот параметр имеет значение по умолчанию для новых проектов. Изменение их всех на истинное устранило проблему.

0 голосов
/ 03 марта 2009

Я предполагаю, что получаемые вами ошибки компоновщика относятся к "неразрешенным символам"?

Если вы используете статические библиотеки (т.е. файл .lib), вам необходимо добавить библиотеку к входу компоновщика, чтобы во время компоновки можно было связать символы. Если вы этого не сделаете, вы получите неразрешенный символ:

  1. Щелкните правой кнопкой мыши проект и выберите Свойства.
  2. Выберите Свойства конфигурации-> Linker-> Input
  3. Введите имя библиотеки (например, filename.lib) в разделе Дополнительные зависимости.
...