Проблема статического связывания библиотек MFC - PullRequest
1 голос
/ 18 ноября 2009

У меня есть рабочее пространство Visual Studio 6, которое я пытаюсь преобразовать в решение Visual Studio 2008. Результатом указанного решения является .dll. Это должен быть .dll, и он должен статически связывать MFC, поскольку я не могу перераспределить MFC существующим клиентам.

Решение состоит из трех проектов, скажем, A, B, C. C - активный проект, выводит .dll и зависит от B. B выводит .lib и зависит от A. A выводит .lib.

В общих свойствах конфигурации у меня A и B установлены статической библиотекой (.lib), а C - динамической библиотекой (.dll). Все три проекта настроены на «Использование MFC в статической библиотеке». Кроме того, для всех трех проектов установлен «Многопоточный» для библиотеки времени выполнения, и ни в одном из них не определено _AFXDLL.

Все правильно собирается до финальной стадии связывания, где я вижу это:

1>nafxcw.lib(wincore.obj) : error LNK2005: _IsPlatformNT already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _InitMultipleMonitorStubs already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xGetSystemMetrics@4 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xMonitorFromPoint@12 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xMonitorFromRect@8 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xMonitorFromWindow@8 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xGetMonitorInfo@8 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xEnumDisplayMonitors@16 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _xEnumDisplayDevices@16 already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnGetSystemMetrics already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnMonitorFromWindow already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnMonitorFromRect already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnMonitorFromPoint already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnGetMonitorInfo already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnEnumDisplayMonitors already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_pfnEnumDisplayDevices already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_fMultiMonInitDone already defined in A.lib(Globals.obj)
1>nafxcw.lib(wincore.obj) : error LNK2005: _g_fMultimonPlatformNT already defined in A.lib(Globals.obj)
1>nafxcw.lib(viewprnt.obj) : error LNK2005: "public: virtual int __thiscall CPrintingDialog::OnInitDialog(void)" (?OnInitDialog@CPrintingDialog@@UAEHXZ) already defined in B.lib(ImagePropertiesDlg.obj)
1>nafxcw.lib(viewprnt.obj) : error LNK2005: "public: __thiscall CPrintingDialog::CPrintingDialog(class CWnd *)" (??0CPrintingDialog@@QAE@PAVCWnd@@@Z) already defined in B.lib(ImagePropertiesDlg.obj)
1>nafxcw.lib(viewprnt.obj) : error LNK2005: "public: virtual void __thiscall CPrintingDialog::OnCancel(void)" (?OnCancel@CPrintingDialog@@UAEXXZ) already defined in B.lib(ImagePropertiesDlg.obj)

Я погуглил проблему до смерти и видел других людей с похожей проблемой, но, похоже, не могу ее решить. Я попытался добавить nafxcw.lib в библиотеки Ignored для C, но это превратило этот пакет ошибок компоновщика в 1500+ неразрешенных ошибок символов. Я могу заставить его скомпилировать / связать, если я сделаю это динамически связывать MFC, но, как я уже сказал, мне нужно *1011*, чтобы статически связать. Я чувствую, что упускаю что-то довольно простое, но не могу обернуться. Будем весьма благодарны за любые случайные мысли и идеи.

Ответы [ 2 ]

5 голосов
/ 19 ноября 2009

Как это часто бывает, решение оказалось таким обыденным и очевидным, что я все еще бью себя за то, что так долго бился об него.

По сути, проект A, о котором говорилось выше, был не проектом, который я непосредственно извлек из старого рабочего пространства VS6, а скорее проектом, который ранее был преобразован другой группой для использования в другом приложении. Я предположил , что он был функционально эквивалентен исходному, но это очень , что далеко не так. Эти ошибки связывания являются действительными, допустимыми множественными ошибками связывания. Когда я начал копаться, я обнаружил, что первый пакет ошибок был связан с включением multimon.h в проект A (что-то, что мне даже не нужно, просто удалил его), а второй пакет из класса, который фактически определен А и Б.

Как я уже сказал, я все еще стону здесь, но, по крайней мере, я должен быть в состоянии решить мою проблему сейчас. Спасибо за помощь и всегда помните, чтобы НИКОГДА не предполагать.

0 голосов
/ 18 ноября 2009

Когда вы попытались игнорировать библиотеку nafxcw, добавили ли вы ее обратно, чтобы попытаться навести порядок ссылок, как предложено в этой статье КБ? Хотя ваша проблема не совсем подходит, она может быть связана. Возможно, что-то можно решить, используя обезьяны с порядком ссылок.

...