В чем причина LNK2001: неразрешенный внешний символ только в одном проекте

У меня есть основная библиотека dll под названием Lib1, у меня есть основное приложение, которое зависит от Lib1, и другая библиотека dll расширения под названием POS, она также зависит от Lib1, я добавляю Lib1, как в ссылки на свойства проекта, он автоматически видит .lib. Я добавил следующие файлы .h и .cpp в Lib1

//MenuBarEx.h
class AMNLIB1_API TMenuBarEx : public CMFCMenuBar
{
    DECLARE_DYNAMIC(TMenuBarEx)
    public:
    TMenuBarEx()
    {
        NONCLIENTMETRICS ncm;
        ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth); 
        ZeroMemory(&m_logFont, sizeof(LOGFONT));

        if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
        {
            m_logFont = ncm.lfMenuFont;
            TCHAR fontName[] = _T("tahoma");
            _tcscpy_s(m_logFont.lfFaceName, fontName);
            CMFCMenuBar::SetMenuFont(&m_logFont);
        }
    }
    virtual ~TMenuBarEx()
    {

    }
    BOOL LoadState(LPCTSTR lpszProfileName /* = NULL */, int nIndex /* = -1 */, UINT uiID /* = */ )
    {
        return TRUE;
    }
    BOOL SaveState(LPCTSTR lpszProfileName /* = NULL */, int nIndex /* = -1 */, UINT uiID /* = */ )
    {
        return TRUE;
    }
protected:
    static LOGFONT m_logFont;
    //DECLARE_MESSAGE_MAP()
};
//-------------------------------------------
//.cpp
#include "stdafx.h" // precompiled header
#include "MenuBarEx.h"

IMPLEMENT_DYNAMIC(TMenuBarEx, CMFCMenuBar)
LOGFONT TMenuBarEx::m_logFont;

Сборка Lib1 завершена успешно, и основное приложение, использующее класс TMenuBarEx, также успешно построено, библиотека POS не выполняет сборку, что приводит к ошибке

POSMain.obj : error LNK2001: unresolved external symbol "protected: static struct tagLOGFONTA TMenuBarEx::m_logFont" (?m_logFont@TMenuBarEx@@1UtagLOGFONTA@@A)

это действительно странно, потому что он определен в cpp и работает в основном приложении, а многие другие библиотеки расширений используют ядро ​​Lib1 и успешно строят.

когда я хочу пройти через это, я снова переопределяю это в POSMain.cpp, это так плохо, но я делаю это, чтобы закончить выпуск. Как я могу это исправить или даже отследить ???


person ahmedsafan86    schedule 11.02.2014    source источник
comment
Вы добавили файл lib в проект POS?   -  person o_weisman    schedule 11.02.2014
comment
@o_weisman: Я добавляю его, используя Свойства- ›Общие свойства-› Структура и ссылки - ›Добавить новую ссылку, затем я добавил проект Lib1, теперь проект распознает .lib и его полный путь. Так же использую Lib1 в основном приложении   -  person ahmedsafan86    schedule 11.02.2014
comment
Обратите внимание на имя структуры: tagLOGFONTA. Некоторые шансы, что у вас есть тег LOGFONTW. Вы должны убедиться, что настройки General + Character Set для всех проектов одинаковы.   -  person Hans Passant    schedule 11.02.2014
comment
все равно все это многобайтовое сейчас у нас есть плоскость для перехода на юникод. все библиотеки являются многобайтовыми. POS зависит от Lib1, и, используя многие вещи, наш строковый тип TString, который наследуется от CString, находится в Lib1, это ядро ​​приложения, только у статических элементов есть проблема только в этом POS проекта, это действительно безумие.   -  person ahmedsafan86    schedule 11.02.2014
comment
Используйте Dependency Walker или dumpbin, чтобы узнать оформленное имя, под которым был экспортирован член m_logFont. Сравните его с именем, на которое жалуется компоновщик; разница часто оказывается проясняющей.   -  person Igor Tandetnik    schedule 11.02.2014
comment
@IgorTandetnik: я упомянул, что он используется библиотека в основном приложении, поэтому нет необходимости смотреть в обходчик зависимостей, однако я посмотрел в обходчик зависимостей и скопировал все экспортированные элементы в блокнот, поискал его, и он уже экспортирован, и, кстати, библиотека POS не задействована и не имеет никакого отношения к этому классу, я просто добавил ее в Lib1 и использовал в основном приложении и перекомпилировал решение, которое оно и есть.   -  person ahmedsafan86    schedule 11.02.2014
comment
@ ahmedsafan86 Какой VS вы используете? Скомпилирован ли Lib1 как файл .dll? Если да, то зачем для этого нужен файл .lib? (если вы полагаетесь на файл .lib, я думаю, вам также нужно добавить его каталог в дополнительные каталоги библиотек в разделе Linker- ›Общие в свойствах проекта) Совместимы ли параметры генерации кода для проектов Lib1 и POS (многопоточная отладка / Отладка и т. Д.)? Одинаков ли метод использования MFC (статический / динамический) в обоих проектах?   -  person o_weisman    schedule 12.02.2014
comment
@o_weisman: вы понимаете, что означает добавление ссылки на проект, о котором я упоминал ранее ?? также .lib используется не только для статического связывания, но и для динамического связывания, если вы экспортируете какие-либо символы из своей dll, файл .lib создается для связывания, если вы импортировали эти экспортированные символы. все они используют одни и те же библиотеки времени выполнения, все в порядке, сборка будет успешной, если в классе нет статического члена, только в этом проекте.   -  person ahmedsafan86    schedule 12.02.2014
comment
@ ahmedsafan86 Нашел предыдущий ответ, посвященный вашей проблеме: stackoverflow.com/questions/2479784/   -  person o_weisman    schedule 13.02.2014