Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Создание MFC Dll extension |
Автор: nikitos1980 8.4.2009, 10:30 | ||||
Помогите решить проблему с реализацией ксасса в dll файл .h
файл .cpp
При компиляции получаю ошибку Warning 1 warning C4273: 'CSimpleObject::CSimpleObject' : inconsistent dll linkage d:\visual c++ .net\c++ .net\ex01dll\ex01dll\simpleobject.cpp 10 Warning 2 warning C4273: 'CSimpleObject::~CSimpleObject' : inconsistent dll linkage d:\visual c++ .net\c++ .net\ex01dll\ex01dll\simpleobject.cpp 14 Error 3 error LNK2019: unresolved external symbol "__declspec(dllimport) const CSimpleObject::`vftable'" (__imp_??_7CSimpleObject@@6B@) referenced in function "public: __thiscall CSimpleObject::CSimpleObject(void)" (??0CSimpleObject@@QAE@XZ) SimpleObject.obj Понимю, что компилятор не видит какой-то функции, но не могу реализовать решение. С Помогите любой инфой Спасибо |
Автор: Earnest 8.4.2009, 17:20 | ||
Непонятно, при компиляции чего у тебя вылезает ошибка: самой DLL или приложения, которое ее подключает? Из поста можно понять, что вроде речь идет от компиляции DLL, но тогда ты действительно где-то напутал с макросами: __declspec(dllimport) в этом контексте не должно встречаться, должен быть экспорт. Смысл в следующем: класс из библиотеки экспортируется, а в приложении он же импортируется. Т.е. ключевые слова при компиляции должны быть разными, когда заголовок компилируется с библиотекой и с приложением. Это достигается с помощью макроса типа AFX_EXT_CLASS: он по разному реализуется в зависимости от наличия другого макроса, AFXEXT. Последний обычно прописываютс в свойствах библиотеки (т.е. он действует при компиляции библиотеки и приводит к тому, что AFX_EXT_CLASS читается как export). А вот при компиляции хедера из библиоткеи в составе приложения AFXEXT не определен, и AFX_EXT_CLASS читается как import. Но есть одна загвоздка, о которой в MSDN написано смутно: это все работает, когда extension-библиотека ровно одна. А если их больше, и между ними есть зависимости, то одним макросом AFXEXT не обойдешься. Возможно, у тебя проблемы именно с этим: макрос не определен, должен быть импорт, а компилятор видит код, вот и ругается. Обычно для "взрослого" приложения об AFXEXT лучше вообще забыть, а определить свои макро-метки для каждой extension DLL и, соответственно, свои определения :
Это пишешь в общем хедере библиотеки, который подключается к клиентскому коду. Сообтветствено, в свойствах библиотеки прописываешь макрос _MYDLL. На тему разных AFX_EXT_CLASS, AFX_EXT_API и прочая можно не париться - это все одно и то же, хватит и одного макроса и для функций и для классов. Надеюсь, смысл понятен. |