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

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

Спасибо

EDIT - я сделал это, как было предложено, и добавил папку вывода в дополнительные каталоги компоновщика. Теперь, однако, я получаю миллион ошибок следующим образом:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" ([email protected][email protected]@@[email protected]) 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)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) 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 &)" ([email protected][email protected]@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" ([email protected][email protected]@[email protected]@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) 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 " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@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 " ([email protected][email protected]@@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 " ([email protected][email protected]@@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 *)" ([email protected][email protected]@[email protected]@[email protected]) 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)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) 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 " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " ([email protected][email protected]@@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)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@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)" ([email protected]@[email protected]@@[email protected]) 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 *)" ([email protected][email protected]@@[email protected]@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 *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" ([email protected]@[email protected]) 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 *)" ([email protected]@[email protected]@@[email protected]@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)" ([email protected]@[email protected]@[email protected]@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)" ([email protected]@[email protected]@[email protected]@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 &)" ([email protected][email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@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 *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" ([email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" ([email protected]@@[email protected]) already defined in msvcprtd.lib(MSVCP90D.dll)

Ответ 1

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

Вы также можете рассмотреть возможность использования "Ссылки" вместо "Зависимости"

EDIT:

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Ошибки, которые вы получаете, это "ошибка LNK2005", где символ в библиотеке, которую вы связываете (msvcprtd.lib), уже определен в другой библиотеке (например, panel.lib). Если вы добавите panel.lib в поле "игнорировать определенную библиотеку" (в VS2008 Configuration Properties → Linker → Input → Ignore specific libraries), ошибки будут остановлены.

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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