2010-09-24 24 views
7

Zaczynam projekt C++, który chciałbym skompilować równie dobrze w Eclipse (Linux) i vs2010 z tego samego repozytorium i może przydać się pomoc w rozpoczęciu pracy. Podczas gdy wiele aspektów można indywidualnie uzyskać Google, miałem nadzieję, że porady dotyczące podejścia do problemu w całości.Pierwsze kroki z wieloplatformowym projektem C++

Na przykład, gdzie należy przechowywać źródła biblioteki, jak zorganizować plik make i jak zintegrować googletest (znalezienie samouczka na temat samego googletest jest trudne). Link do samouczka, który odnosi się do tych aspektów, byłby świetny, lub seria samouczków, które mogłyby pomóc.

Moje doświadczenie jest w języku C# i staram się utrzymać "czystość" i organizację moich projektów VS.

+0

Czy masz na myśli kompatybilność między VS2010 w Windows i Eclipse w systemie Linux? Eclipse sam w sobie jest wieloplatformowym IDE. – Reinderien

+0

Tak, dziękuję za pytanie. Eclipse działa na systemie Linux (OpenSuse 11.3) – ccook

Odpowiedz

13

Wykonałem projekty na różnych platformach, które używały "natywnych" systemów kompilacji na obu platformach (pliki vsproj w systemie Windows i plikach Makefile na Linuksie), ale z pewnością było trudno zachować oba pliki projektu. Tak, zgadzam się z innymi sugestiami, że powinieneś spróbować zacząć od solidnego narzędzia do budowania platformy. CMake lub ewentualnie Boost build wydają się przyzwoite opcje - prawdopodobnie istnieje wiele innych.

Jeśli chodzi o biblioteki innych firm, będziesz musiał trzymać się rzeczy, które są solidnie przetestowane na różnych platformach. Boost jest najlepszą biblioteką ogólnego przeznaczenia dla C++ (tak, widzisz, że jest tu wspomniany w prawie każdym wątku C++ ... ale to dlatego, że naprawdę jest ładną kolekcją przydatnych rzeczy). Jeśli chodzi o XML, HTTP, biblioteki obrazów, interfejs użytkownika - dostępne są wszystkie dobre opcje dla różnych platform - po prostu rozejrzyj się lub zapytaj, czy masz określone wymagania. Cokolwiek robisz, nie korzystaj z jakiejś biblioteki z CodeProject lub innej strony zorientowanej na MS, która została przetestowana tylko w Visual Studio 6 - to tylko doprowadzi do nędzy. Większość bibliotek GNU opiera się obecnie na oknach, więc powinieneś być w miarę bezpieczny z tymi rzeczami.

Chociaż będzie to kuszące, spróbuj zminimalizować platformę #ifdefs w swoim kodzie - zamiast tego, zamiast tego, w miarę możliwości wybieraj w bibliotece dowolne elementy platformy.

Powodzenia!

+0

żałuję, że nie mogę utworzyć więcej niż jednego upvote – Tim

+0

Odnośnie '# ifdef's w ​​przeciwieństwie do oddzielnych bibliotek - nie jest nieuzasadnione umieszczanie wspólnego kodu w klasie bazowej w jednej bibliotece, a następnie przedłużenie klasa do oddzielania klas potomnych dla poszczególnych platform, które różnią się zależnie od platformy, z wykorzystaniem polimorfizmu. Wtedy jedyne '# ifdef's potrzebne są do określenia, która klasa potomna jest używana. – Reinderien

+0

Jeśli chodzi o biblioteki ifdef/oddzielne, można również utworzyć wspólny plik nagłówkowy, a następnie podzielić pliki źródłowe z niektórymi źródłami we współużytkowanym cpp, a niektóre źródła w plikach specyficznych dla platformy, które są tworzone tylko w odpowiednim systemie. –

4

Jedna rzecz, którą mógłbym zasugerować, jeśli zamierzasz działać na wielu platformach i chcesz, aby wszystko było jak najbardziej "czyste": Scentralizuj swój system budowania za pomocą nowoczesnego narzędzia do tworzenia wielu platform, takiego jak Scons. Jest napisany w języku Python, jest dość zwięzły i potężny i działa wszędzie.

Jeśli jesteś fanem Eclipse, po prostu zainstaluj Eclipse w systemach Windows i GNU/Linux. Jak już wspomniałem powyżej, jest to platforma wieloplatformowa i można ją uruchomić dla kompilatorów na różnych systemach.

+0

Wygląda obiecująco, ale jak trudno będzie go wdrożyć? Właśnie owinąłem się wokół make – ccook

+3

Moim skromnym zdaniem, składnia jest strasznie hackowata. Jeśli przeczytasz o jego historii, nigdy nie planowano, aby było to publiczne rozwiązanie na dużą skalę. Jest trudny do skalowania, trudny do utrzymania i ma dość słabą ludzką parsibility. Wystarczy spojrzeć na liczbę narzędzi, które nakładają obfuskację na wierzch zaciemniania (automake i ich krewni). Z drugiej strony Scons jest po prostu Pythonem i jest dobrze udokumentowany wieloma przykładami. – Reinderien

+0

@ccook: SCons jest dużo bardziej zautomatyzowany, a ponieważ masz pełną moc Pythona, możesz użyć 'glob.glob' i' os.listdir', aby uzyskać listę plików w katalogu, unikając w ten sposób utrzymania listy plików ... –