2016-05-18 2 views
0

то, что у меня здесь, довольно глупый и нубийский вопрос, но я просто не могу найти ответ в Интернете. Когда я хочу создать проект DLL (из существующих C++ проект), я прочитал, что мне нужно реализовать следующие строки в начале заголовочных файлов:Несколько классов в DLL-файле

#ifdef _EXPORTING 
#define CLASS_DECLSPEC __declspec(dllexport) 
#else 
#define CLASS_DECLSPEC __declspec(dllimport) 
#endif 

я смотрел на примере в MSDN:

// MathFuncsDll.h 
#ifdef MATHFUNCSDLL_EXPORTS 
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else 
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif 

Теперь я хочу, чтобы понять, нужно ли мне изменить «_EXPORTING» и «CLASS_DECLSPEC» для каждого нового класса я делаю? Например, если бы я создать класс с именем «Foo» в том же проекте, как «MathFuncsDll.h» я должен был бы поместить следующие строки в начале .h файла:

// FooDll.h 
#ifdef FOO_EXPORTS 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API __declspec(dllimport) 
#endif 

Или есть ли какая-то строка во всех .h файлах проекта?

И еще одно, если я использую namespace, чтобы ссылаться на всю dll как на одну и извлекать из нее классы, нужно ли положить using namespace *NAME* в каждый файл .h?

+0

Узнайте, что такое макрос, и тогда вы узнаете, что происходит. – PcAF

ответ

1

Нет, вам не нужно создавать новые макросы для каждого класса:

class MATHFUNCSDLL_API Foo {...}; 
class MATHFUNCSDLL_API Boo {...}; 
class MATHFUNCSDLL_API MyNewClass {...}; 

Для второй д: не используйте использование пространств имен в файле заголовка: "using namespace" in c++ headers

Ваш заголовок может выглядит как следующее:

#pragma once 
namespace foo { 
    class MATHFUNCSDLL_API Foo {...}; 
    class MATHFUNCSDLL_API Boo {...}; 
    class MATHFUNCSDLL_API MyNewClass {...}; 
} 

EDITED

// mylibdef.h 
#pragma once 
#ifdef _EXPORTING 
#define CLASS_DECLSPEC __declspec(dllexport) 
#else 
#define CLASS_DECLSPEC __declspec(dllimport) 
#endif 

// myclass1.h 
#pragma once 
#include "mylibdef.h" 
namespace mylib { 
class CLASS_DECLSPEC MyClass1 {...}; 
} 

// myclass2.h 
#pragma once 
#include "mylibdef.h" 
namespace mylib { 
class CLASS_DECLSPEC MyClass2 {...}; 
} 
+0

Значит, вы говорите мне, что я должен использовать один заголовок для всех классов? Это кажется странным .. –

+0

@YechiamWeiss: нет, я сказал вам использовать один макрос, который можно поместить в отдельный заголовок mydlldef.h и включить его в свои заголовки. Также вы можете создать отдельный заголовок для каждого класса и использовать пространство имен и marco, как я покажу. – AnatolyS

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