2009-06-09 5 views
8

Mam zamiar korzystać z bibliotek w moim programie C++. Rozwój odbywa się na Linuksie, ale aplikacja jest przeznaczona do kompilacji zarówno na Linuksie, jak i na Windowsie. Rozumiem bezpośredni odpowiednik dla bibliotek współdzielonych (.so) w systemie Windows jest DLL, prawda?Tworzenie bibliotek programów w systemie Windows i LINUX [C++]

W systemie Linux za pomocą g ++ mogę utworzyć bibliotekę wspólną przy użyciu flag -fPIC i -shared. AFAIK, nie ma potrzeby wprowadzania innych zmian kodu w przypadku biblioteki współużytkowanej. Ale rzeczy są inne w Windows DLL. Tam powinienem określić funkcje, które muszą być eksportowane za pomocą dllexport, prawda?

Moje pytanie brzmi: jak zarządzać tą sytuacją? Mam na myśli dllexport jest nieprawidłowy w Linuksie i kompilator da błąd. Ale jest wymagany w systemie Windows. Jak więc napisać funkcję, która będzie kompilować się na obu platformach bez jakiejkolwiek zmiany kodu?

Kompilatory używane

  • g ++ - Linux
  • VC++ - Windows

Każda pomoc będzie wielki!

Odpowiedz

9

Określamy __declspec(dllexport) klasy:

#define EXPORT_XX __declspec(dllexport) 

class EXPORT_XX A 
{ 
}; 

Następnie można sprawdzić na platformie i tylko definiować makra na oknach. Np .:

#ifdef WIN32 
#define EXPORT_XX __declspec(dllexport) 
#else 
#define EXPORT_XX 
#endif 

My głównie budować biblioteki statyczne, więc nie może być więcej rzeczy do zrobienia dla dynamicznych bibliotekami ale idea jest taka sama - użycie preprocesora makro do określenia ciąg znaków, który trzeba włożyć w kodzie Windows.

+0

Dzięki. Jaki będzie typ biblioteki DLL utworzonej w oknach? Czy to będzie dll COM? Czy są szanse na uruchomienie problemów związanych z piekłem DLL? –

+0

Użycie polecenia dllexport nie powoduje ekspozycji biblioteki dll na system COM. Szanse dll piekła zależą od tego, jak rozpowszechniać dll i aplikacji. Jeśli zawsze instalujesz biblioteki DLL, których wymaga twoja aplikacja, problem związany z tą biblioteką nie stanowi problemu. –

+0

@sean e: Dzięki. Zawsze będę instalował wymagane aplikacje DLL w katalogu aplikacji. Czasami mogą występować niewielkie aktualizacje, które zastąpią tylko jedną bibliotekę DLL, a nie całą aplikację. Czy to będzie problem? –

2

Możesz użyć dyrektywy preprocesora #ifdef do kompilacji warunkowej. Na przykład:

#ifdef WIN32 
    // Win32 specific code 
#else 
    // Elsewhere 
#endif 
5

Inną opcją jest użycie pliku .def do projektu Windows. Ten plik określa eksport plików DLL, więc nie będziesz musiał zepsuć bazy kodu. (Ale makra są zdecydowanie najlepszym sposobem, aby uniknąć dodatkowego pliku.)

+0

Używanie symboli C++ w plikach .def może być dość nieładne. –

+0

Zależnie od tego, co robi, jeśli przez biblioteki rozumie jakąś architekturę wtyczek, lepiej z interfejsem C i pliki .def będą działały. – diapir

1

Inną opcją, której teraz używam, jest użycie MinGW w systemie Windows. W ten sposób możesz używać gcc w Windows i nie musisz się martwić o bzdury declspec.

+1

Dzięki za odpowiedź. Cóż, jest to aplikacja typu open source i chcę wspierać szeroką gamę kompilatorów, aby pomyślnie skompilować aplikację. Sądzę, że wszystkie te bzdury są wymagane. –