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
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
Hey,

Ostatnio podczas pisania unit testów naszło mnie na refleksje i mam przeczucie, że spierniczyłem design projektu, ale do rzeczy. Stworzyłem strukturę gdzie foldery są podzielone na funkcjonalności, a w każdym takim folderze są pliki źródłowe i CMakeLists tworzący z nich bibliotekę, która linkowana jest do głównego targetu projektu. Załóżmy, że istnieje klasa MqttClient i klasa MqttConnection, która impelemntuje interfejs. W unit testach tworzę mocka tego interfejsu co jest oczywiste, ale pojawia
MqttClient i klasa MqttConnection, która impelemntuje interfejs. W unit testach tworzę mocka tego interfejsu co jest oczywiste, ale pojawia się problem, żeby do głównego targetu testów dolinkować wcześniej wspomnianą bibliotekę z uwagi na to, że ona kompiluje implementację tego interfejsu czego w testach być nie powinno.


@Parseval: nie ma czegoś takiego, że "w testach tego być nie powinno". Testujesz tak jak uważasz, że jest stosownie. Testowanie interfejsu, który w 100% produkcyjnych
  • Odpowiedz
Nie, mam jeden folder tests pod którym mam pliki z testami do modułów i foldery z cmakami, które są okrojone o źródła implementacji interfejsów.


@Parseval: trochę słabo, testy powinny być przy module. Dobrą metryką modularności jest ile folderów muszę przenieść, żeby przenieść cały moduł do innego projektu. Jak wszystko siedzi w jednym folderze/podfolderach odpowiedzialnych za dany moduł to jest idealnie
  • Odpowiedz
#naukaprogramowania #programowanie #cpp
próbuję sie uczyć #cmake

-Odpalam oficjalne docsy, ni #!$%@? nie wiem co sie dzieje
-odpalam tutorial na yt, gość z 17 minut poradnika 12 poświęcił na naprawę błędów, bo po co się przygotować do własnego nagrania
-wracam do docsów, i od pierwszej strony nie wiem co się dzieje. Oficjalny tutorial wygląda dosłownie w sposób "wklej te śmieszne linijki do CMakeLists.txt, i zobacz że działa, a teraz je usuń i
@RedveKoronny: Po co ludzie piszący w C++ muszą mieć system budowania projektu oparty o język skryptowy kompletny w sensie Turinga, i dodatkowo tak fatalny jak ten DSL w CMake? Dlaczego wszystkie inicjatywy napisania kolejnego systemu budowania dla C++ kończą się takim przekombinowaniem, że robi się z tego cały nowy język programowania? Zastanawiam się, czy to nie jest jakaś forma masochizmu. Tak jak by nie można było oprzeć budowania projektu na jakimś
  • Odpowiedz
Jak ujarzmić cholernego #cmake by raz na zawsze działał tak jak ja chcę? Ofc na windowsie.
Ścieżki do kompilatora, linkera, make/ninja muszą być w PATH czy czy je podawać jako argumenty do cmake, czy jako zmienne środowiskowe w skrypcie wołającym to gówno, czy jako zmienne w cmakelists? Jak w ogóle zmusić go by olał próbną kompilację bo jak już znajdzie jakimś cudem avr-gcc lub inny nie-x86 to krzyczy, że nie może kompilować
Zrobiłem cross-compile programu używając CMake i ustawiając RPATH, żeby binarka szukała dynamicznych bibliotek .so w konkretnej ścieżce pomijając domyślną ścieżkę /usr/lib. Wstępnie wszystko jest dobrze, bo biblioteki są znajdowane z wyjątkiem jednej. Co ciekawe ustawienie LD LIBRARY PATH na tę samą ścieżkę co RPATH pomaga. Macie pomysł dlaczego tak się dzieje?

CMake: https://pastebin.com/XXWB9Xbb

#linux #programowanie #programista15k #programowanie #cpp #cmake
o pod Windowsem jest domyślnie taka funkcjonalność, którą próbuję tutaj uzyskać, prawda? Tzn. mając .exe i wrzucając koło niego .dll automatycznie się zaczytają razem z zależnościami.


@Parseval: O tym nie mam bladego pojęcia. Ale być może - w win *.dll są obok. W OSX, czy Guix też programy mają biblioteki obok. Ale co Ty masz tam na ARM to ciężko powiedzieć. Specyfika linkera też tutaj wchodzi.
Ale fajnie, że udało się
  • Odpowiedz
Cześć,

Robię cross-compilację programu na urządzenie z ARMową architekturą. Problem polega na tym, że libki, które używa program leżą sobie na docelowym urządzeniu, a na hoście ich nie mam. Libek (.so) i zależności pomiędzy nimi jest bardzo dużo, a chciałbym uniknąć ich przerzucania na swoją maszynę lub cross-compilacji. Wiem, że da się linkerowi powiedzieć, żeby ignorował "unresolved-symbols", ale chciałbym to jakoś ładniej rozwiązać. Stąd pytanie:
Czy da się powiedzieć linkerowi, że przy
@Parseval: Niezbyt ładnie, ale równie dobrze możesz sobie przygotować mock'a tych bibliotek z odpowiednimi funkcjami i parametrami. Nazwy powinny się "zmanglować" tak samo. Choć prawdopodobnie ta metoda w przypadku jakichś bardziej złożonych rzeczy nie zadziała, bo musiałbyś odtwarzać też wszystkie klasy i struktury, szkoda roboty. Moim zdaniem, jeśli już planujesz to zrobić porządnie to ustaw sobie porządnie środowisko... albo użyj buildroota czy innego yocto.
  • Odpowiedz
@dixieman: to zalezy jaka to biblioteka, sa tez biblioteki header only xD bardzo malo informacji dajesz, co to za tajny projekt? Ogarnij w dokumentqcji biblioteki jak ja linkowac
  • Odpowiedz
Siema,

Mam klasę X, w zakresie której tworzony jest obiekt klasy Y. Ze względu na unit testy, które będą puszczane na maszynie o innej architekturze potrzebuję podmienić implementację klasy Y tworząc jakiegoś stuba. Jedyną rzeczą jaką chciałbym zmienić w kodzie, to stworzenie interfejsu dla klasy Y, a na etapie kompilacji pod unit testy podmieniać tylko plik źródłowy. Żeby to wszystko ogarnąć, trzeba stworzyć 3 headery (InterfaceY.hpp, Y.hpp i YStub.hpp) i dwa pliki
@Passer93: Spróbuję zrobić to w ten sposób :)
@Saly: Tego próbowałem uniknąć, żeby nie dokładać do konstruktora implementacji narzędzia (obiekt Y), które jest zależne od architektury.
  • Odpowiedz
@Saly: Rozumiem twój punkt widzenia, ale pliki CMake'a to dla mnie też część "kodu" i łączenie różnych targetów z różnych plików obiektowych to normalna praktyka.

Z CMake'iem jest jak z dżinem, tyle lat go człowiek próbuje okiełznać i nagiąć do swojej woli że jak już się uda to będzie go wykorzystywał do wszystkiego z zemsty xD
  • Odpowiedz
Cześć,

Mam program, który posiada część real-time i non-real-time. Używam systemu czasu rzeczywistego Xenomai (pod #linux). Sam Xenomai ma wrappery dołączane linkerem, które nadpisują wszystkie klasyczne funkcje linuxowe. Mój program składa się z wielu bibliotek z czego jedna powinna mieć owrappowane funkcje. Niestety dołączenie flag linkera dla tej biblioteki powoduje owrappowanie funkcji całego projektu. Co robię źle, że nie zostaje to rozdzielone?

CMake dla tej biblioteki: https://pastebin.com/qsFwmBgV
Część CMake projektu -
@Krall: A gdzie jest problem? Jesli masz dzialajace polecenie ktore buduje Ci cala aplikacje to po prostu podziel odpowiednie czesci na flagi kompilatora/linkera. Same mejki sa bardzo proste, definiujesz cel i jego zaleznosci.
  • Odpowiedz
@Babooco: Możesz spróbować coś w tym kierunku:

- wygenerowania sobie compile_commands.json przez CMake'a (+/- -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ale musisz poczytać o tym)
- podpiąć Eclipse żeby korzystał z tego compile_commands.json (google coś wskazuje, ale musisz sam poszukać szczegółów)
  • Odpowiedz
Jakie książki albo źródła internetowe polecacie do poznania CMake? Z tego co się zorientowałem to na zrobienie każdej rzeczy są co najmniej 3 różne sposoby a sama dokumentacja nie zawsze wszystko dokładnie objaśnia.
#cpp #cmake
@patrolez: no w tym przypadku to jest python z pyenv także pudło

aha, ofc jak zwykle od razu po zadaniu pytania sam sobie poradziłem

set(Python3_FIND_VIRTUALENV ONLY)
  • Odpowiedz
Próbuję ogarnąć projekt w #cpp z użyciem #cmake i mam problem z podpięciem #sfml. Jakiś czas temu zmienił się sposób łączenia tej biblioteki i nie podłącza się już FindSFML.cmake tylko SFMLConfig.cmake i nie jestem w stanie tego zmusić do działania.
Zadanie: podpiąć SFML tak żeby mi działało i na Linuksie, i na Windowsie, bez potrzeby instalowania go (w przypadku Linuksa). Mam pobrane źródła, wrzuciłem je do /lib/SFML w moim projekcie i
@BoKoR: ma działać i tu, i tu, docelowo ma to być projekt na RPi, ale nie chcę się ograniczać, bo wiem, że może pójść w drugą stronę ¯\_(ツ)_/¯, szczególnie, że RPi ma ograniczoną wydajność.
2. Mam taki dość ciekawy projekt, jako wytchnienie od tych wszystkich generycznych Magic Mirrorów i RetroPi - grę, która wykorzysta dużo elektroniki i może nawet dodatkowych, maleńkich ekranów. Nie chcę się jakoś mocno nad tym rozwodzić, bo
  • Odpowiedz
Zna się któryś mirek na programie #cmake? Nie mogę z nim dojść do porozumienia. Podczas kompilacji wywala mi że nie znajduje kilku bibliotek boost, ale co mnie najbardziej niepokoi to to że dostaję komunikat

Please make sure Boost 1.48.0 is installed on your system

Przy czym używam wersji boost 1.66
Z góry dzięki za pomoc
#programowanie
@Lynx_Lynx: aaa, pod windowsem. :D To w sumie nie wiele moge Ci pomoc, pewnie w ogole nie znajduje boosta, wiec sciagniecie go w wersji 1.48 niewiele Ci da. W CmakeLists widze ze nie ma EXACT wiec rownie dobrze 1.66 powinien lyknac gdyby go tylko znalazl.
  • Odpowiedz
@Lynx_Lynx: no niestety, na windowsie to masakra jest z developowaniem zwlaszcza w C/C++. nie ma jednego katalogu gdzie trafiaja biblioteki i musisz to sobie jakos sam organizowac, podawac sciezki etc. Na linuksie wszystko trafia Ci do /usr/lib i /usr/include i sie nie martwisz.
  • Odpowiedz
#cmake #cpp

Mam taki oto scenariusz zależności, chcę zbudować sobie projekt root , który zależy od projektu log

root CMakeLists.txt
- - - - - - - - -- - - - - - - - -- - - - - - - - -- - - - - - - - -- - - - - - - - -- - - - - - - - -

cmake_minimum_required(VERSION 3.0.2)
project(mtcp)
@Jojne_Zimmerman: Catch jest bardzo spoko, coraz więcej projektów zaczyna go używać. Największym plusem jest łatwość użycia - include single-header i do boju :) Jeśli czas kompilacji jest problemem, to lepiej użyć jakiegoś google testa.
  • Odpowiedz
#cpp #cmake #sfml #programowanie
Mam stary projekt gry w SFMlL i w ramach nauki cmake chciałem go dodać do tego projektu. Drzewo projektu: pastebin
Natomamiast tutaj zawartość mojego CMakeLists.txt.
Jestem na windowsie. Cmake odpalam z cmd w katalogu target poleceniem: cmake -G "MSYS Makefiles" -D SFML_ROOT="C:/SFML-2.3.2" ..
Ktoś wie może co robię źle, że po odpaleniu make dostaje takie błędy jak na picrel (nie znajduje implementacji sfml (?) )
uzytkownikTHCE - #cpp #cmake #sfml #programowanie
Mam stary projekt gry w SFMlL i w ...

źródło: comment_6j14yHyuNG4zjckTzB5hEN9ZOpxj2358.jpg

Pobierz
@wik5: wyglada na to, że wszystko jest ok

cmake -G "MSYS Makefiles" -D SFML_ROOT="C:/SFML-2.3.2" ..
-- Found SFML 2.3.2 in C:/SFML-2.3.2/include
debugC:/SFML-2.3.2/lib/libsfml-system-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-system.adebugC:/SFML-2.3.2/lib/libsfml-window-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-window.adebugC:/SFML-2.3.2/lib/libsfml-graphics-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-graphics.adebugC:/SFML-2.3.2/lib/libsfml-network-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-network.adebugC:/SFML-2.3.2/lib/libsfml-audio-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-audio.adebugC:/SFML-2.3.2/lib/libsfml-main-d.aoptimizedC:/SFML-2.3.2/lib/libsfml-main.a -- Configuring done
  • Odpowiedz
@QBA__: Mirki z #programowanie #linux #raspberrypi mam taki problem: słabo znam składnię #cmake, a chodzi o kompilację warunkową.
Chce zrobić tak żebym miał jeden program(korzystający z bibliotek OpenCV), który będzie się kompilował na PC i raspberryPi.
Problem jest taki, że na raspberry korzystam z dedykowanej kamerki, która korzysta z biblioteki raspicam, na PC używam normalnej kamery USB. Jak wiadomo na PC nie ma takich bibliotek, bo i po co.

Z
@ksiak: OK cumplu chwyci, tam niżej też muszę taki warunek zrobić. Najważniejsze, z tego co widzę, że da sie definiować zmienne:

IF (${BCMHOST})

tego mi brakowało, dzięki
  • Odpowiedz