Экспортирую класс CMainExportClass в статически подключаемую библиотеку "MyDll.dll".
Полученный "MyDll.lib" подключил к одному проекту, использующему некоторые методы класса CMainExportClass — всё замечательно, собралось, заработало. При попытке использования этого же lib-файла в другом проекте показало, что при экспорте в "MyDll.dll" не были экспортированы методы:
void CMyList<STwoItem>::SetFirst() и STwoItem * CMyList<STwoItem>::GetNext()
для класса CTwoList (см. ниже код).
#ifdef MY_EXPORT
#define DLL_CLASS __declspec(dllexport)
#else
#ifdef MY_IMPORT
#define DLL_CLASS __declspec(dllimport)
#pragma comment(lib, "MyDLL.lib")
#else
#define DLL_CLASS
#endif
#endif
/* шаблонный класс для построения классов COneList и CTwoList */
template <class CListItem>
class CMyList
{
...
void SetFirst();
CListItem* GetNext();
...
};
/* структура, с которой работает класс COneList */
struct SOneItem
{...};
/* структура, с которой работает класс CTwoList */
struct STwoItem
{...};
typedef class DLL_CLASS CMyList<SOneItem> COneList_tmpl;
typedef class DLL_CLASS CMyList<STwoItem> CTwoList_tmpl;
/* ни в одном из двух классов функции void SetFirst() и CListItem* GetNext() не переопределяются */
class DLL_CLASS COneList : public COneList_tmpl
{
...
int Find(char* _str, char _mode)
{
/* в этой функции используются обе функции - и SetFirst(), и GetNext() */
}
...
};
class DLL_CLASS CTwoList : public CTwoList_tmpl
{
/* в классе ни одна из функций не вызывает ни SetFirst(), ни GetNext() */
...
};
/* основной экспортируемый класс */
class DLL_CLASS CMainExportClass
{
...
COneList one_object;
CTwoList two_object;
...
};
Для класса же COneList, который объявлен практически идентично, аналогичные методы экспортируются.
Выяснилось, что если сделать вызов этих методов из какого-либо явно определённого метода CTwoList, компилятор их экспортирует без вопросов. Решение решением, но корявенькое.
Как более лучше заставить компилятор экспортировать эти методы?
Компиляторы C++: MSVS 6.0 и 2005