Wersjonowane użycie obcej bliblioteki/SDK w C++

0

Witam,
Ostatnie 6 lat jako C#, .Net developer & architekt za granicą, a teraz po powrocie do PL i założeniu własnej DG, dostałem projekt w C++ (tak wiem dałem się wyrolować przez klineta, ale z 2giej strony lubię nowe wyzwania) i mam jako świeżak w tym języku swoje problemy :)
Ogólnie staram się przenieść swoje doświadczenie z OO i TDD do C++ i jakoś se radzę ze składnią i featurami czy wskaźnikami języka.

Mam wiedzę jak rozwiązać mój problem w C#, jak działają tam mechanizmy takie jak referecje konkretnej versji dll, ich dynamiczne ładowanie, pisanie odpowiednich adapterów, wersjonowanie i rozwijanie interfejsów, itp., gorzej w C++

Problem mam taki:
W projkecie używam zewnętrznej open sourcowej biblioteki (w moim przypadku open62541 napisanej w C), ale problem niezależny od rodzaju sdk.
**Projekt zakłda, że ma być kompatybilny z daną i z późniejszymi nowymi wersjami sdk. ** Tak jak to z softem open source, nie wiadmo kiedy będą nowe wersje, i czy zawsze będą kompatybilne z poprzednimi. Na razie używam w projekcie C++ plików *.h i *.c tego sdk, z którego opakowałem potrzebne mi funkcje, struktury, typy w własne OO C++ Wrappery, tak żębym mógł testować swój kod bez zależności obcej biblioteki. Klinet wymaga TDD, tzn. w swych unit testach, mockujem virtualne klasy w C++, które zwracają mi fakowane dane z tego sdk, także moja logika śmiga na czystym C++.

Nie rozumiem jednak kilku kwestii:
Jak jest versjonowany soft w C++? Zamierzam stworzyć powiedzy 1-2 moduły jako *.exe, które będą mogły być odpalane pod linuxem, a wspólny core logic, czy stworzyony framework jako bilkiotekę. coś ala dll w .Net.

Idee mam taką:
Tworzę czysty niewersjonowany interface w C++, virtualna klasa, która definiuje & adaptuje wyszstkie potrzebne mi typu, funkcje.
Następnie mój kod ma zależność tylko do tego interfejsu. Także, jeśli na w sdk jest struktura X, to ja używam struktury XAdapter z mojego adaptera, i nie mam zależności do sdk.
Dla wersji sdk v.1.0 piszę własny versjonowany adapter, który jest w stanie typy sdk1.0 przekształcić na moje własne.
Dla wersji sdk v.2.0 piszę własny versjonowany adapter, który jest w stanie typy sdk2.0 przekształcić na moje własne.
Dzięki temu jestem w stanie nie naruszać swojej logiki i zmienić np. wersję sdk.-> usecase: klient ma już zainstalowane sdk w jakiejś wersji i tylko instaluje sobie nasz soft + adapter do jego wersji sdk.

Chcę osiągnąć coś podobnego do .Neta w sensie dynamicznego ładowania biblioteki z zależnośći od wersji sdk.
Mój kod będzie rozwijany w ten sposób, by był kompatybilny z różnymi wersjami sdk poprzez wersjonowane adaptery i np. będę mógł w zależności od potrzeb implementować daną ilość adapterów.
Oczywiście jak będę chcial np.wykorzystać jakieś nowy funkcje z powiedzmy versji v2.0 sdk, to mój adapter na 2.0 zwraca wartość i moja logika musi to umieć obsłużyć. Ta samo logika dla adaptera 1.0 nie będzie zwrać nic, bo adapter 1.0 np. zwróci pustą listę, albo mniej danych.

Szkic architektury jako załącznik.

Szukałem info na forum i w necie, ale nie znalazłem nic kokretnego pod c++.
A że w projektcie jestem sam :D temu post.

pozdro i z góry dzięki

0

Tyle niepotrzebnego tekstu, żeby zadać w miarę proste pytanie:

Chcę osiągnąć coś podobnego do .Neta w sensie dynamicznego ładowania biblioteki z zależnośći od wersji sdk.

Po rysunku widzę, że adaptery dziedziczą po wspólnym interfejsie czyli obydwie wersje SDK mają ten sam interfejs. Robisz prostego PIMPLa. Nagłówek IAdapter zostawiasz sobie w głównym projekcie a dwie implementacje przenosisz do dwóch różnych projektów, które produkują Ci dllki z implementacją dla dwóch różnych SDK.

Potem masz dwie opcje, albo w trakcie instalacji uzupełniasz jakiś plik .ini na podstawie którego Twoja aplikacja będzie wiedziała jaką dllke załadować, albo ustawiasz wersje w trakcie kompilacji i Twoje narzędzie do budowania powino Ci w tym pomóc, przykładowo CMAKE ma do tego gotowe narzędzia - configure_file, version.

Szukałem info na forum i w necie, ale nie znalazłem nic kokretnego pod c++

Bo w C++ takie rzeczy robi się zazwyczaj na piechote ;) Standard i toolset nie ułatwiają sprawy, dopiero w nadchodzącym standardzie C++20 pojawi się defnicja modułów, która może usprawnić to i owo.

0

Dzięki za odpowiedź i czas.
Tak jak mysłałem, Adapter1.0 musi być budowany i wersjonowany jako odrębny projekt, ma zależność tylko do sdk 1.0.
Tak samo analogicznie Adapter2.0.
Niewersjonowany interfejs IAdapter zostaje częścią projketu, który też bedzie osobno wersjonowany.

Deploy bedzie wyglądac tak, że np. wersja X projektu zawiera też adapter 1.0, a np. wersja Y projektu zawiera adapter 1.0 i 2.0

0

Deploy bedzie wyglądac tak, że np. wersja X projektu zawiera też adapter 1.0, a np. wersja Y projektu zawiera adapter 1.0 i 2.0

W takim razie tworzysz osobny nagłówke version.h gdzie będziesz miał coś w stylu #define VERSION 1.0. Jak wspomniałem ten numerek powinieneś ustawiasz sobie pół automatycznie z użyciem toolsetu do budowania. Potem na podstawie tego makro ładujesz sobie jedną albo drugą dllke.

1 użytkowników online, w tym zalogowanych: 0, gości: 1