/ / Projekt CMake kompilujący świetne biblioteki SHARED, ale nie z bibliotekami STATIC - c ++, cross-platform, cmake

Projekt CMake kompilujący wspaniałe biblioteki SHARED, ale nie z bibliotekami STATIC - c ++, cross-platform, cmake

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:

  1. że są tam biblioteki. dobrze
  2. że kompilator ma do nich dostęp. DOBRZE.
  3. że pliki CMake z P1 i P2 są podobne. DOBRZE.
  4. 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 № 1

Kiedy 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.