Przynajmniej w systemach Linux i Solaris, statyczne biblioteki są tak naprawdę tylko zbiorem skompilowanych plików .o umieszczonych w jednym dużym pliku. Podczas kompilowania biblioteki statycznej zwykle flaga -fpic jest pomijana, więc wygenerowany kod zależy od pozycji.Łączenie biblioteki współużytkowanej z biblioteką statyczną: czy biblioteka statyczna musi być kompilowana inaczej niż w przypadku, gdy aplikacja łączyła tę bibliotekę?
Teraz mówię, że moja biblioteka statyczna to B. Zbudowałem ją i otrzymuję wynikowy plik .a, który jest tak naprawdę tylko globusem wszystkich zależnych od pozycji plików .o. Teraz mam wspólną bibliotekę, którą chciałbym zbudować, A, i chcę, żeby statycznie łączyła B. Kiedy buduję A, oczywiście użyję flagi -fpic, aby wygenerować niezależną pozycję kodu. Ale jeśli łączę się z B, czy nie łączę zależne od pozycji i niezależne od pozycji pliki obiektów?
Otrzymuję wiele błędów związanych z relokacją tekstu, chyba że określę również -przypisywanie tekstu i myślę, że to może być przyczyną. Wydaje się, że kiedy kompiluję bibliotekę, naprawdę muszę ją skompilować: razy, wersję wspólną, wersję statyczną i wersję statyczną, która może być używana przez współdzieloną bibliotekę. Czy mam rację? Mógłbym dalej używać -mimpure-text, ale strona man w g ++ mówi, że jeśli to zrobisz, obiekt nie zostanie w końcu udostępniony (nie jest jasne, czy to wszystko jest nieautoryzowane, czy tylko statycznie połączone części, czy ktoś to wie?) .
Pytanie jest poprawnie napisane, "pomija" -fpic w pierwszym akapicie, prowadząc do kodu zależnego od pozycji, a następnie używa go w drugim akapicie, prowadząc do kodu niezależnego od pozycji. –