2015-08-20 3 views
0

У меня есть заголовок .dll, который объявляет класс.Глобальный заголовок .dll

После объявления класса он создает статический объект класса.

Функции .dll экспортируют интерфейс со статическим объектом.

Я получаю необъяснимое segfault, когда возвращается первый вызов в одну из этих экспортируемых функций. Так что мой вопрос: Можно ли объявить статический объект в DLL-заголовке, как это:

class Foo{ 
public: 
    void bar(); 
}; 

static Foo foo; 

__declspec(dllexport) void func() { foo.bar(); } 
+0

http://stackoverflow.com/questions/92546/variable-declarations-in-header-files-static-or-not –

+0

@NO_NAME Я не понимаю причину связи. Вы можете мне помочь? –

+0

Ссылка о том, что происходит, когда вы помещаете определение переменной в заголовок. Короче: это, как правило, плохая идея. Возможно, [singleton] (http://stackoverflow.com/questions/1008019/c-singleton-design-pattern) - лучший способ. (Это зависит от того, чего вы хотите достичь.) –

ответ

1

За то, что вы пытаетесь, вы должны удалить класс из заголовка файла завершено, оно делает вообще не принадлежат.

Попробуйте что-то больше, как это:

MyDll.h (совместно с проектами, которые хотят использовать DLL):

#ifndef MyDllH 

#ifdef BUILDING_DLL 
#define MYDLL_EXPORT __declspec(dllexport) 
#else 
#define MYDLL_EXPORT __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

MYDLL_EXPORT void func(); 
// other functions as needed... 

#ifdef __cplusplus 
} 
#endif 

#endif 

MyDll.cpp: (составитель только в рамках проекта DLL) :

#define BUILDING_DLL 
#include "MyDll.h" 

class Foo 
{ 
public: 
    void bar(); 
}; 

void Foo::bar() 
{ 
    //... 
} 

static Foo foo; 

void func() 
{ 
    foo.bar(); 
} 

// other functions as needed... 
+0

Это явно более чистый дизайн (и я планирую обменять это на первое место), но похоже, что это не повлияет на мой произвольный segfault. –

Смежные вопросы