Wpis z mikrobloga

Mam strukturę plików zorganizowana w taki sposób że foldery mają w sobie cmakelists.txt, pliki cpp i pliki header. Chciałbym zrobić tak żeby pliki header były inckudowalne przez #include<nazwafolderu/nazwaheadera>. Próbowałem w cmakelists danego folderu zrobić

addlibrary(nazwafolderu ...)
targetincludedirectories(nazwafolderu ${CMAKECURRENTSOURCEDIR})

Niestety to nie działa. W tutorialach na internecie widziałem że ludzie tworzą podfoldery include I tam wrzucają wszystkie headery w danym folderze, a następnie robią targetincludedirectories(nazwafolderu include).

Da się to jakoś rozwiązać bez tego dodatkowego folderu? Nie chcę aż takich drastycznych zmian wprowadzać. Do tej pory było to rozwiązane przez
target
includedirectories(${CMAKESOURCE_DIR}/sex), gdzie src to główny folder z całym kodem. Wydaje mi się że to rozwiązanie jest złe, bo wtedy dany folder(moduł) wciąga do siebie headery z całego projektu, a nie tylko ze swojego folderu. Mam rację że tak się nie powinno robić?

#cmake #cpp
  • 6
  • Odpowiedz
W add library na pierwszym miejscu podajesz nazwę targetu, a później konkretne pliki. Analogicznie w target include directories, najpierw podajesz nazwę targetu do którego chcesz podpiąć includy.

Generalnie to wszystko zależy od tego co chcesz osiągnąć. Jeżeli to nie są nagłówki publiczne, to nie ma potrzeby wydzielać ich i mogą znajdować się w katalogu ze źródłami. Wtedy możesz je "includować" z tylko z generatorem $<BUILD INTERFACE: jak w dokumentacji: https://cmake.org/cmake/help/latest/command/target_include_directories.html

Jeśli nie
  • Odpowiedz
  • 0
@Tytanowy: nagłówki są publiczne (tzn używane przez inne targety w innych folderach). Czy w takim wypadku trzeba będzie wydzielić folder include I bez tego się nie obejdzie?
  • Odpowiedz
@asdxmee: Tak, jest to dosyć standardowy schemat organizacji kodu. Każdy moduł ma swój interfejs (w twoim przypadku include) oraz src w któym jest prywatny kod dla modułu.
  • Odpowiedz
  • 0
@H4RRY: a co z headerami, które mają kod potrzebny tylko do wewnętrznej implementacji danego modulu? Gdzie powinny one się znaleźć?

Czy dobrze rozumiem że include trzyma tylko te headery, które powinny być dostępne na zewnątrz modułu, a folder src trzyma wszystkie pliki cpp oraz te headery, które są wewnętrzna (prywatną) implementacja modułu?

Przy okazji zapytam jeszcze o jedno. Jakie są wady/zalety takiej enkapsulacji na poziomie cmake? Czy to jest pod względem
  • Odpowiedz
Czy dobrze rozumiem że include trzyma tylko te headery, które powinny być dostępne na zewnątrz modułu, a folder src trzyma wszystkie pliki cpp oraz te headery, które są wewnętrzna (prywatną) implementacja modułu?


@asdxmee: to jest jedno z rozwiązań, najczęściej stosowane. można zrobić "internalheaders" z PRIVATE i "externalheaders" z PUBLIC

dodatkowe rzeczy jak np nie wiem, mniejsze pliki binarne albo szybsza kompilacja


@asdxmee: teoretycznie kompilatorowi krócej zajmie znalezienie "dupa.h"
  • Odpowiedz
@asdxmee Nie wiem niestety jak z kompilacją, ale publiczne nagłówki warto wydzielić również dlatego, że możesz je później zainstalować razem z biblioteką za pomocą cmake install, gdy np. udostępniasz komuś model w postaci binarnej + api.
Poza tym publiczne nagłówki łatwiej się używa jeżeli leżą w mocno pogrupowanym i posegregowanym drzewie katalogów, wtedy łatwiej znaleźć odpowiedni plik używając cudzej biblioteki. Osobiście wolę w src trzymać jeden wielki wór, a w include takie
  • Odpowiedz