Hej, mam kilka szybkich pytań na temat biblioteki dll.Pytanie dotyczące eksportowania/importowania DLL i eksternacji na Windows
Zasadniczo używam ifdefs do obsługi dllexport i dllimport, moje pytanie dotyczy w rzeczywistości umieszczenia dllexports i dllimports, a także zewnętrznego słowa kluczowego.
Umieszczam plik dllimports/dllexports w plikach nagłówkowych, ale czy muszę wstawiać dllexport i dllimports do rzeczywistej definicji?
Co powiesz na typedefs?
Czy umieszczam dllimport/dllexport z przodu? jak w
dllexport typedef map<string, int> st_map
dotyczące Również extern słowa kluczowego Widziałem to wykorzystywane tak:
extern "C" {
dllexport void func1();
}
Widziałem także może zostać wykorzystane tak:
extern dllexport func1();
Jeden zawiera "C", a drugi nie, moje pytanie brzmi: jaka jest różnica i czy muszę z niej korzystać? Jeśli tak, to czy używam go zarówno dla dllexport, jak i dllimport, czy też muszę go używać zarówno w deklaracjach plików nagłówkowych, jak i definicjach?
Mój projekt będzie biblioteką współdzieloną, zawiera kilka plików klas, które chcę eksportować, niektóre pliki do publikacji, które chcę eksportować i niektóre funkcje globalne, które również chcę wyeksportować do biblioteki dll.
Czy ktoś mnie oświeci, proszę?
EDIT:
Dobrze myślałem, że będę pisać mały wyciąg, co zrobiłem, również zauważyć, że buduję bibliotekę zarówno dla linux i windows tak zrobić czek na to:
mydll.h
#ifdef WINDOWS
# ifdef PSTRUCT_EXPORT
# define WINLIB __declspec(dllexport)
# else
# define WINLIB __declspec(dllimport)
# endif
#else
# define WINLIB
#endif
WINLIB void funct1();
teraz w kodzie źródłowym:
mydll.cpp
#define PSTRUCT_EXPORT
void funct1() <---- do i need to add WINLIB in front of it?
Or is doing it in the header enough?
Dobra, mam coś bardzo podobnego, z wyjątkiem zewnętrznego słowa kluczowego. Mam podobne makra zdefiniowane we wszystkich plikach klas. Tak więc nazwa zewnętrzna służy do obsługi kompilatorów języka C? Mój projekt jest głównie C++ –
Czy muszę również dodać instrukcje dllimport/export w definicji? –
Jedynym powodem, dla którego potrzebujesz zewnętrznego "C", jest próba połączenia funkcji C++ z kodu C. Zasadniczo możesz zignorować zewnętrzne "C", dopóki nie uzyskasz błędów linkera. –