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ę
Dołączanie określonych wersji bibliotek do projektów
- Rejestracja: dni
- Ostatnio: dni
- Postów: 114
- Rejestracja: dni
- Ostatnio: dni
- Postów: 103
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ć..
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2310
@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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2202
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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 143
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 708
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.