Typowym rozwiązaniem jest mieć pojedynczy makro (nazwijmy go EXPORT
), które albo rozszerza się dllimport
lub dllexport
w zależności od tego, czy jakiś „budowania DLL teraz” określają to ustawiony tak:
#ifdef MAKEDLL
# define EXPORT __declspec(dllexport)
#else
# define EXPORT __declspec(dllimport)
#endif
class EXPORT xyz {
// ...
};
Chodzi o to, że podczas tworzenia biblioteki DLL, należy dodać MAKEDLL
do definicji preprocesora. W ten sposób cały kod zostanie wyeksportowany. Klienci, którzy łączą się z twoją biblioteką DLL (i tym samym dołączają ten plik nagłówkowy), nie muszą w ogóle nic robić. Nie definiując MAKEDLL
, automatycznie zaimportują cały kod.
Zaletą tego podejścia jest to, że obciążenie związane z uzyskaniem właściwych makr jest przenoszone z wielu (klientów) do samego autora biblioteki DLL.
Wadą tego jest to, że używając powyższego kodu, nie można już po prostu skompilować kodu bezpośrednio do jakiegoś modułu klienta, ponieważ nie można zdefiniować makra EXPORT
na nic. Aby to osiągnąć, musisz mieć kolejną kontrolę, która jeśli jest prawdziwa, definiuje EXPORT na nic.
Na nieco inny temat: w wielu przypadkach nie jest możliwe (lub pożądane!) Wyeksportowanie całej takiej klasy. Zamiast tego możesz po prostu wyeksportować potrzebne symbole. Na przykład w twoim przypadku możesz po prostu wyeksportować dwie publiczne metody. W ten sposób wszyscy członkowie prywatne/zabezpieczone nie zostaną wyeksportowane:
class xyz
{
public:
EXPORT void printing();
EXPORT void printing(int a);
};
Ku mojemu zaskoczeniu, ja nie znajdź istniejące pytanie, które się powiela. Pomyślałem, że to dość powszechne pytanie. –
Sprawdź: http://stackoverflow.com/questions/6620791/exporting-classes-to-dlls – Ajay