Ошибка компоновщика, когда определяемая пользователем dll ссылается на другую определяемую пользователем dll

Я пытался реализовать стек протоколов, используя шаблон проектирования уровня протокола: http://www.eventhelix.com/realtimemantra/patterncatalog/protocol_layer.htm

В нашем проекте все слои представлены в виде отдельных dll. У меня есть следующие слои:

  1. DLL уровня приложения

  2. LLC Layer dll

  3. DLL уровня MAC

  4. DLL физического уровня

У меня есть еще один проект в том же решении, который реализует шаблон проектирования и имеет реализации общих функций уровня протокола. Все мои слои наследуются от класса Protocol Layer Base. Зависимость между проектами выглядит следующим образом: DLL шаблона проектирования уровня протокола: Нет зависимости DLL физического уровня: DLL шаблона проектирования протокола DLL уровня MAC: DLL шаблона проектирования протокола и DLL физического уровня DLL уровня LLC: DLL шаблона проектирования протокола и DLL уровня MAC Уровень приложения dll: dll шаблона проектирования протокола и dll LLC Layer

В зависимости от шаблона проектирования каждый наш слой имеет указатели на слой выше и ниже него. И поток, который мы разработали, выглядит следующим образом: в конструкторе уровня приложения мы создаем объект уровня LLC, затем уровень LLC создает уровень Mac, а уровень MAC, в свою очередь, создает физический уровень. Все они связаны с помощью указателей.

DLL проекта My Protocol Design Pattern и DLL физического уровня строятся правильно. Но другие сборки dll выдают ошибку компоновщика. Произнесение неразрешенных внешних элементов конструктору нижележащего слоя. Это ошибки, которые я получаю.

==================================

  1. Как вы строите exe? Я вижу, вы столкнулись только с проблемами компоновщика. Либо вы ссылаетесь в неправильном порядке, либо что-то пошло не так. Попробуйте связать их в правильном порядке. Это должно решить проблему. Если нет, предоставьте дополнительную информацию.

person kernel    schedule 24.02.2013    source источник


Ответы (1)


Мы не создаем exe, но мы пытаемся создать dll.

person kris123456    schedule 24.02.2013
comment
мы хотим иметь четыре отдельных dll для каждого уровня и еще одну dll, которая содержит базовый класс для всех уровней (уровень протокола, пакет протокола и т. д., как указано в шаблоне проектирования уровня протокола) - person kernel; 24.02.2013
comment
Когда я добавил ссылку на другие проекты, весь проект был скомпилирован. Это нормально ? - person kernel; 24.02.2013
comment
Вы нашли решение? DLL работает нормально? Если да, закройте вопрос, получив ответ. - person kernel; 24.02.2013
comment
1> phLayer.obj: ошибка LNK2019: неразрешенный внешний символ "public:
виртуальный __thiscall CProtocolLayer :: ~ CProtocolLayer (void)"
(?? 1CProtocolLayer @@ UAE @ XZ) упоминается в функции
__unwindfunclet $ ?? 0CPhysicalLayer @@ QAE @ PAVCProtocolLayer @@@ Z $ 0 1> phLayer.obj: error LNK2019: неразрешенный внешний символ "public:
__thiscall CReceiveProtocolHandler :: CReceiveProtocolHandler (class CProtocolLayer *)"
(?? 0CReceive @ @ QAE @ PAVCProtocolLayer @@@ Z), на который есть ссылка в функции «public: __thiscall CPhysicalLayer :: CPhysicalLayer (class CProtocolLayer *)» (?? 0CPhysicalLayer @@ QAE @ PAVCProtocolLayer @@@ Z) 1> phLayerNK20j19: ошибка внешний символ "общедоступный: __thiscall CTransmitProtocolHandler :: CTransmitProtocolHandler (класс CProtocolLayer *)"
(?? 0CTransmitProtocolHandler @@ QAE @ PAVCProtocolLayer @@@ Z), указанный в функции "общедоступный: __thiscall CPhysicalLayer (класс CPhysicalLayer) :: CPhysicalLayer (?? 0CPhysicalLayer @@ QAE @ PAVCProt ocolLayer @@@ Z)
1> phLayer.obj: ошибка LNK2019: неразрешенный внешний символ "public:
__thiscall CProtocolLayer :: CProtocolLayer (class CProtocolLayer *, class CProtocolLayer *)" (?? 0CProtocolLayer @@ QAE @ PAV0 @ 0 @ Z), на который есть ссылка в функции "public: __thiscall
CPhysicalLayer :: CPhysicalLayer (class CProtocolLayer *)"
(?? 0CPhysicalLayer @@ QAE @ PAVCProtocolLayer @@@ Z) 1> phLayer.obj: error LNK2019: неразрешенный внешний символ "public: int __thiscall
CProtocolPacket :: getBodyLength (void)"
(? GetBodyLength @ CProtocolPacket @@ QAEHXZ), указанный в функции
"public: virtual void __thiscall CPhysicalLayer :: Data_req ( class
CProtocolPacket *) "
(? Data_req @ CPhysicalLayer @@ UAEXPAVCProtocolPacket @@@ Z) 1> phLayer.obj: error LNK2019: неразрешенный внешний символ" public: void __thiscall CReceiveProtocolHandler :: Handle_Receive (class *) "
(? Handle_Receive @ CReceiveProtocolHandler @@ QAEXPAVCProtocolPacket @@@ Z), указанный в функции" private: void __thiscall
CPhysicalLayer :: dataRead (void) "(? dataRead @ CPhysicalLayer @@ AAEXXZ)
1> phLayer.obj: error LNK2019: неразрешенный внешний символ" public:
void __thiscall CProtocolPacket :: AddTrailer (int , char *) "
(? AddTrailer @ CProtocolPacket @@ QAEXHPAD @ Z), на который ссылается функция
" private: class CProtocolPacket __thiscall
CPhysicalLayer :: convertToProtocolPacket (класс
std :: basic_string, class < br> std :: allocator>) "
(? convertToProtocolPacket @ CPhysicalLayer @@ AAE? AVCProtocolPacket @@ V? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Allocator @ D @ 2 @@ std @@@ Z) 1> phLayer.obj: ошибка LNK2019: неразрешенный внешний символ "public: < br> void __thiscall CProtocolPacket :: AddHeader (int, char *) "
(? AddHeader @ CProtocolPacket @@ QAEXHPAD @ Z), указанный в функции
" private: class CProtocolPacket __thiscall
CPhysicalLayer :: convertToProtocolPacket (class
std :: basic_string, класс
std :: allocator>) "
(? convertToProtocolPacket @ CPhysicalLayer @@ AAE? AVCProtocolPacket @@ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V ? $ распределитель @ D @ 2 @@ std @@@ Z) - person kris123456; 17.09.2013