Mam jeden działający projekt (P1) z EXE wywołującym bibliotekę STATIC. Kompiluje się i wykonuje poprawnie w systemie Windows, MAC i Linux.
Teraz mam drugi projekt (P2) z EXEwywołanie biblioteki STATIC, która również wywołuje inne biblioteki STATIC. W tym przypadku działa dobrze na WINDOWS i MAC, ale w Linuksie nie mam wiele odniesień podczas łączenia. Sprawdziłem:
- że są tam biblioteki. dobrze
- że kompilator ma do nich dostęp. DOBRZE.
- że pliki CMake z P1 i P2 są podobne. DOBRZE.
- flagi i polecenia kompilatora są podobne. DOBRZE.
Byłem zdesperowany i po prostu zmieniłem biblioteki z STATIC na SHARED. A teraz kompiluje się dobrze w Linuksie. Zasadniczo właśnie się zmieniłem add_library(lib STATIC ...)
do add_library(lib SHARED ...)
a teraz wszystko działa dobrze.
Nie mam pojęcia, dlaczego to działa w SHARED, ale nie w STATIC.
Dzięki za pomoc. Z poważaniem.
Odpowiedzi:
1 dla odpowiedzi № 1Kiedy twoja statyczna biblioteka A zależy od innejstatyczna biblioteka B, ta zależność nie jest rozwiązywana podczas tworzenia A, ale kiedy łączysz swój plik wykonywalny z A. Tylko wtedy linker potrzebuje B, aby rozwiązać symbole wymagane przez A (w zależności od użycia A).
Nie mogę teraz znaleźć żadnych szczegółów na ten temat,ale mocno zakładam, że Visual Studio (lub kombinacja z CMake) dodaje te biblioteki automatycznie, więc działa w systemie Windows. W Linuksie musisz jawnie dodać B do swoich bibliotek linków, aby pomyślnie połączyć swój plik wykonywalny.
Podczas tworzenia biblioteki współdzielonej A wszystkie symbolez B są rozwiązywane podczas tworzenia B (więc linker faktycznie sprawdza, czego potrzebuje od B). Dlatego Twój przykład działa, gdy przełączasz się na biblioteki współdzielone.