Ошибки компоновщика между несколькими проектами в Visual C++

StackOverflow https://stackoverflow.com/questions/604484

Вопрос

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

Спасибо

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

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)
Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ:

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

Другие советы

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

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

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

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

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

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

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

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

У меня была очень похожая проблема, которая оказалась связана с тем, что в одной из моих библиотек для параметра «Рассматривать wchar_t как встроенный тип» было установлено значение, отличное от других.По умолчанию этот параметр имеет значение false в новых проектах.Изменение их всех на true устранило проблему.

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

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

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

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

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

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

Меня это устраивает. Ответьте на этот вопрос, если кому-то нужна помощь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top