Dołączanie określonych wersji bibliotek do projektów

0

Hej,
Powiedzmy że mam projekt A i projekt B. Projekt a wymaga libfoo w wersji 4.1.3, projekt b wymaga libfoo 3.7 i libbar 4.5. Podpowie ktoś jak uzyskać efekt podobny ale dla projektów w C tak jak w pythonie się uzyskiwało poprzez python -m venv i pip install bez instalowania zależności system-wide?
Dziękuję

0

Binarki zwykle mają 3 sposoby dodawania bibliotek, możesz też próbować ręcznie je podkładać przez mechanizmy, które wykorzystuje do ładowania, co źle wygląda oczwyiście.

CMake ma możliwość budowania projektu z danymi wersjami bibliotek, w wersji statycznej, dynamicznej musiałbyś mieć biblioteki z nazwą dodatkowo wersji, żeby przy szukaniu mógł je rozróżnić.

Możesz też w dockerze wystartować specyficzne środowisko.

Na linuxie możesz sobie samemu stworzyć virtualne środowisko, jakieś skrypty shell, które ci odseparują od systemu wszystko, na windowsie pod wsl2 to samo dasz radę zrobić..

0

@lester29:

Nie jest to pytanie na gruncie gołego C, ale buildera i managera pakietów jaki by był z tym używany.
A o rodzaju kompilatora/IDE do C akurat milczysz

0

Środowisko: Linux, CLion gcc

2

Ja użył bym cmake
choć jestem świadomy że jest conan ale mi on niestety nie podpasował

  include(FetchContent)
  FetchContent_Declare(
		foo
		GIT_REPOSITORY https://github.com/user-libfoo/libfoo.git
		GIT_TAG        v1.1
		)
  FetchContent_MakeAvailable(foo)

  target_link_libraries(projectA PRIVATE
	   foo::foo)
  include(FetchContent)
  FetchContent_Declare(
		foo
		GIT_REPOSITORY https://github.com/user-libfoo/libfoo.git
		GIT_TAG        v1.2
		)
  FetchContent_MakeAvailable(foo)

  target_link_libraries(projectB PRIVATE
	   foo::foo)

wczoraj się zastanawiałem czy dało by rade tak wciągnąć do projektu konkretna wersje QT :)

0

Zciagasz zrodla jako zaleznosc projektu a nie do systemu, budujesz od zera i linkiujesz statycznie.
Bez budowania od zera i dynamicznie tez sie da w miare identycznie, tylko jesli jest mozliwosc statycznie ze zrodel (nie zawsze jest), to jest to mniej podatne na pozniejsze problemy.

1

Jak chesz to robić jak człowiek to biegiem na linucha albo jakieś bsd.
Albo będziesz linkował statycznie albo dynamicznie. Obie metody się używa.
Najpierw niech ci zadziała w linii komend potem sobie zrobisz make. ewentualnie cmake etc.
Wygodniej do testów byłoby pewnie jak nie jesteś z nimi zaznajomiony robić w skrypcie shella.
Włączasz tmuxa i będziesz w jednym edytował a w drugim odpalał i patrzył co się dzieje.

w cc będzie ci potrzebne -I -L -l oraz -Wl,linker opt
Zapoznaj się z tym. ( man gcc i czytaj wszystkie opcje których nie czaisz, man clang nie bo clang okrojony )

przykład z życia wzięty:
Mamy sobie kod biblioteki, ale chcę sobie wkompilować tylko jedną funkcję.
Nie chcemy aby ta libka była na systemie, no gdziekolwiek, a potem linkować ja dynamicznie. Ma być zaszyta w programie.

Robimy tak:
cc -Wall -Wextra -pedantic -O2 -std=c99 -c funkcja.c -o funkcja.o
I jeszcze jedna
cc -Wall -Wextra -pedantic -O2 -std=c99 -c funkcja2.c -o funkcja2.o

Tworzymy archiwum które może być *linkowane"
ar rcs libfunkcje.a funkcja.o funkcja2.o

Następnie robisz sobie obiekt swojego programu
cc -Wall -Wextra -pedantic -O2 -std=c99 -c program.c -o program.o

dobra polinkujmy to. Wydaje mi się, że warny już nic tu nie dają. Ale nie jestem pewien. ;-)
Jak widzisz wyleciało -c :o
cc -Wall -Wextra -pedantic -O2 -std=c99 program.o -lfunkcje -o program

A teraz sobie przypomniałem, że jeszcze mam drugi program który by z tego czerpał.
cc -Wall -Wextra -pedantic -O2 -std=c99 program2.o -linnefunkcje -lfunkcje -o program2

fin. Dalej nie pomagam, to wszystko jest i tak ze sto razy napisane w necie,
Przećwicz to na start.

do dynamicznego pewnie przyda się readelf bo na bank wszystko się pokompiluje, polinkuje i rozsypie się przy ./program ;-)
(szczególnei jak przemieścisz swój programik w dir)

pzdr.

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