Kończę jeden z moich najwcześniejszych projektów w C ++, który (zgodnie z ramami) powinien być wieloplatformowy. W pełni rozwinąłem projekt w Windows i Visual Studio, myśląc, że ponieważ wszystkie biblioteki są wieloplatformowe, wykonanie kompilacji OSX „później” byłoby trywialne. Okazało się, że tak nie jest, ale raczej „kod systemu Windows” nie działa poprawnie i trzeba było naprawić niektóre błędy kompilacji.
Jakie techniki istnieją wcześniej, aby zapewnić zgodność kodu ze wszystkimi platformami? Równoczesne rozwijanie wszystkich platform, a tym samym testowanie kodu na każdej platformie w tym samym czasie, gdy dodawane są nowe funkcje, zamiast tworzyć kolejne wersje platform jedna po drugiej? (*)
Poszukując konkretnej porady, która nie zależy od narzędzi, ale raczej „procesów programistycznych”, które pomagają kompatybilność między platformami, niezależnie od używanych narzędzi. Jak ten (*) powyżej.
W szczególności tworzę wtyczkę VST z WDL-OL ( https://github.com/olilarkin/wdl-ol ) i kilkoma wieloplatformowymi bibliotekami DSP. Projekty WDL-OL mają skonfigurowane projekty VS i Xcode, ale wydaje mi się, że problemy wynikają z bibliotek, a następnie z różnic w kompilatorach.
źródło
Odpowiedzi:
Tworzenie przenośnego kodu może być bardzo trudne.
Najpierw kilka oczywistych porad związanych z językiem:
Następnie kilka zaleceń projektowych:
Wreszcie delikatne punkty:
TCHAR
), ale może to być trudne w połączeniu ze standardową biblioteką (np.cout
Vswcout
w zależności od tego, czy używaszchar
lubwchar_t
)Ale to tylko porady. W tej dziedzinie nie można uzyskać pewności.
źródło
-Wall -Wextra -Werror
-pedantic
.Nic nie może zagwarantować, że kod jest zgodny z platformą inną niż budowanie, uruchamianie i testowanie go. Dlatego podejście wszystkich rozsądnych ludzi polega na budowaniu, uruchamianiu i testowaniu aplikacji na każdej platformie, na której ich zdaniem trzeba będzie zbudować, uruchomić i przetestować.
Ciągła integracja (CI) może nieco zmniejszyć to obciążenie w przypadku mniejszych projektów, ponieważ można uzyskać tanie lub bezpłatne agenty kompilacji dla niektórych platform (głównie Linux), rozwijać program w systemie Windows i po prostu wrócić do systemu Linux, gdy wystąpi problem.
OSX CI jest jednak dość skomplikowany.
źródło
Jeśli pytasz o „procesy programistyczne”, a podstawową platformą programistyczną jest Windows z Visual Studio, proponuję spróbować zbudować projekt bez uwzględnienia „windows.h”. Otrzymasz wiele błędów kompilacji, które wskażą Ci wiele miejsc, w których będziesz musiał zmienić kod. Na przykład „DWORD” nie zostanie # zdefiniowany i trzeba go zastąpić
uint32_t
wszędzie (google forstdint.h
i znajdziesz przydatne informacje o typach liczb całkowitych i ich definicjach międzyplatformowych). Następnie musisz zastąpić wszystkie wywołania API Win32, takie jak,Sleep()
z ich odpowiednikiem na wiele platform (ponownie, Google jest twoim najlepszym przyjacielem, który pokaże odpowiednie pytania i odpowiedzi na stronach stosu * .com). Prawdopodobnie nie uda ci się znaleźć wszystkich odpowiednich zamienników dla wielu platform dla twojego kodu i będziesz musiał zwrócićinclude "windows."
dyrektywę, ale ją zawrzeć#ifdef _WIN32
- więcej szczegółów tutajZadawaj coraz bardziej konkretne pytania i otrzymuj odpowiedzi - to ogólna sugestia dotycząca „jaki powinien być proces rozwoju”
EDYCJA 1 Kolejną moją propozycją jest użycie gcc i / lub clang na maszynie programistycznej Windows (wraz z Visual Studio)
źródło
To zależy od wspomnianych „niektórych błędów kompilacji”. Nie wiedząc, co to jest, nie można być konkretnym.
Mam wieloplatformowy kod dla Windows / Linux / iOS / Android / Mac. Każda nowa platforma przyniosła dodatkowe błędy i ostrzeżenia przy pierwszym dodaniu. Szybko dowiesz się, które konstrukcje powodują problemy. Unikaj ich lub wyodrębnij różnice w nagłówku za pomocą
#ifdef
s. Staraj się nigdy nie przechodzić#ifdef
między platformami w obrębie samego kodu.Jeden przykład:
tworzy tymczasową instancję,
MyClass
która jest usuwana pomyfunction
zwróceniu. W przypadku niektórych moich kompilatorów C ++ instancja ta jest do odczytu / zapisu (a fakt, że jest tymczasowy i wkrótce zostanie zniszczony, nie martwi kompilatora). W przypadku innychmyfunction
konieczne jest ponowne zdefiniowanie, aby wziąćconst MyClass &
, lub kompilator narzeka. Nie ma znaczenia, co mówi standard C ++ lub który kompilator jest właściwy, a który zły. Po napotkaniu błędu kilka razy, co wiem (a) albo zadeklarować zmienną tymczasową typuMyClass
i przekazać, że domyfunction
lub (b) stwierdzenie, że odwołanieconst
wmyfunction
i wykorzystaćmutable
tu i tam deconstify.Podsumowując: zdobywaj doświadczenie i rozwijaj własne standardy kodowania.
źródło
Możliwym sposobem na ułatwienie przenoszenia może być poleganie tylko na deklaracjach i funkcjach dostarczonych przez standard C ++ 11 oraz przy użyciu bibliotek i platform międzyplatformowych, takich jak POCO i Qt .
Ale nawet to nie jest niezawodne. Pamiętaj o aforyzmie
Dzięki praktyce, dyscyplinie i dużemu doświadczeniu, przeniesienie programu na inną platformę można zwykle zrobić szybko. Ale doświadczenie i wiedza są bardzo ważne.
źródło