Pracuję nad biblioteką C ++. Ostatecznie chciałbym udostępnić go publicznie na wiele platform (przynajmniej Linux i Windows), wraz z kilkoma przykładami i powiązaniami Pythona . Prace przebiegają nieźle, ale w tej chwili projekt jest dość chaotyczny, zbudowany wyłącznie w i dla Visual C ++, a nie w ogóle wieloplatformowy.
Dlatego uważam, że porządek jest w porządku. Pierwszą rzeczą, którą chciałbym poprawić, jest struktura katalogów projektu. Chciałbym stworzyć strukturę odpowiednią dla narzędzi Automake , aby umożliwić łatwą kompilację na wielu platformach, ale nigdy wcześniej ich nie używałem. Ponieważ nadal będę wykonywał (większość) kodowania w programie Visual Studio, będę potrzebować miejsca, w którym będę przechowywać również pliki projektów i rozwiązań programu Visual Studio.
Próbowałem znaleźć w Google terminy takie jak „Struktura katalogów biblioteki C ++”, ale nie pojawiają się żadne przydatne informacje. Znalazłem kilka bardzo podstawowych wskazówek, ale nie ma krystalicznie jasnych rozwiązań.
Przeglądając niektóre biblioteki open source, wymyśliłem następujące rzeczy:
\mylib
\mylib <source files, read somewhere to avoid 'src' directory>
\include? or just mix .cpp and .h
\bin <compiled examples, where to put the sources?>
\python <Python bindings stuff>
\lib <compiled library>
\projects <VC++ project files, .sln goes in project root?>
\include?
README
AUTHORS
...
Nie mam wcześniejszego doświadczenia z programowaniem wieloplatformowym / projektami open source / mam małe doświadczenie i jestem bardzo zdumiony, że nie mogę znaleźć dobrych wskazówek, jak zorganizować taki projekt.
Jak ogólnie należy zorganizować taki projekt biblioteczny? Co warto przeczytać? Czy są jakieś dobre przykłady?
Odpowiedzi:
Jedną z rzeczy, która jest bardzo powszechna wśród bibliotek uniksowych, jest to, że są zorganizowane w taki sposób, że:
./ Makefile and configure scripts. ./src General sources ./include Header files that expose the public interface and are to be installed ./lib Library build directory ./bin Tools build directory ./tools Tools sources ./test Test suites that should be run during a `make test`
W pewnym stopniu odzwierciedla tradycyjny system plików Uniksa, w
/usr
którym:/usr/src Sometimes contains sources for installed programs /usr/include Default include directory /usr/lib Standard library install path /usr/share/projectname Contains files specific to the project.
Oczywiście mogą one skończyć się w
/usr/local
(co jest domyślnym prefiksem instalacyjnym dla GNU autoconf) i mogą w ogóle nie przylegać do tej struktury.Nie ma sztywnej reguły. Osobiście nie organizuję rzeczy w ten sposób. (W
./src/
ogóle unikam używania katalogu, z wyjątkiem na przykład największych projektów. Nie używam też autotools, wolę CMake.)Moja sugestia jest taka, że powinieneś wybrać układ katalogu, który będzie odpowiedni dla Ciebie (i Twojego zespołu). Zrób wszystko, co jest najbardziej rozsądne dla wybranego środowiska programistycznego, narzędzi do tworzenia i kontroli źródła.
źródło
Jest taka niesamowita konwencja, z którą niedawno się spotkałem, która może być pomocna: The Pitchfork Layout (również na GitHub ).
Podsumowując, w podrozdziale 1.3 stwierdza się, że:
Ponadto myślę, że
extras/
katalog jest miejscem, w którym powinny znajdować się wiązania Pythona .źródło
Myślę, że nie ma dobrych wskazówek na to. Większość z nich to tylko osobiste preferencje. Jednak niektóre IDE określą dla Ciebie podstawową strukturę. Na przykład program Visual Studio utworzy oddzielny folder bin, który jest podzielony na podfoldery Debug i Release. W VS ma to sens, gdy kompilujesz kod przy użyciu różnych celów. (Tryb debugowania, tryb wydania).
Jak mówi greyfade, użyj układu, który ma dla ciebie sens. Jeśli komuś się to nie spodoba, będzie musiał po prostu samodzielnie go zrestrukturyzować. Na szczęście większość użytkowników będzie zadowolona z wybranej struktury. (Chyba że jest naprawdę niechlujny.)
źródło
Uważam, że biblioteka wxWidgets (open source) jest dobrym przykładem. Obsługują wiele różnych platform (Win32, Mac OS X, Linux, FreeBSD, Solaris, WinCE ...) i kompilatory (MSVC, GCC, CodeWarrior, Watcom itp.). Możesz zobaczyć układ drzewa tutaj:
https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/
źródło
Mogę naprawdę polecić używanie CMake ... jest to programowanie międzyplatformowe i jest znacznie bardziej elastyczne niż automake, używanie CMake i będziesz mógł pisać kod międzyplatformowy z własną strukturą katalogów na wszystkich systemach.
źródło