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ę
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ć..
@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
Środowisko: Linux, CLion gcc
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 :)
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.
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.