mister2010, если не секрет, что у тебя с русским языком? Ну нельзя же делать столько ошибок!
Есть два кардинально противоположных ключевых слов (нестандартных): __export и __import. Когда ты пишешь библиотеку, то ты помечаешь все функции/классы/переменные атрибутом __export. Таким образом, эти объекты помещаются в публичную область библиотеки. Затем, когда ты пишешь программу, использующую эту библиотеку, ты помечаешь объявления тех же самых функций/классов/переменных словом __import. В этом случае компилятор будет пытаться найти указанные объекты в динамических библиотеках, которые ты подключаешь к проекту. Правильные программисты народ ленивый (китайцы, индусы и им подобные не в счет). Им лень писать два раза один и тот же код, поэтому они делают один общий хидер с объявлениями функций/классов/переменных, используя макросы препроцессора для подстановки правильных __export/__import. Делается это так:| Код | #ifndef _MYHEADER_H #define _MYHEADER_H
#ifdef MYLIB_BUILD #define DLLPUBLIC __export #else #define DLLPUBLIC __import #endif
class DLLPUBLIC MyClass { //.... };
extern "C" DLLPUBLIC void myfunc();
extern DLLPUBLIC int myvar;
#endif /* _MYHEADER_H */ |
extern "C" нужен для того, чтобы компилятор сгенерировал имя функции в стили языка С. Так как в противном случае будет очень сложно его узнать для ручного импорта из библиотеки (GetProcAddress). |