Piszę dość dużą bibliotekę współdzielonych obiektów C ++ i napotkałem mały problem, który sprawia, że debugowanie jest uciążliwe:
Jeśli zdefiniuję funkcję / metodę w pliku nagłówkowym i zapomnę utworzyć dla niej kod pośredniczący (podczas programowania), ponieważ tworzę jako współdzieloną bibliotekę obiektów, a nie plik wykonywalny, nie pojawiają się żadne błędy w czasie kompilacji, informujące mnie, że mam zapomniał zaimplementować tę funkcję. Jedyny sposób, w jaki dowiaduję się, że coś jest nie tak, to w czasie wykonywania, kiedy w końcu aplikacja łącząca się z tą biblioteką wypada z błędem „niezdefiniowany symbol”.
Szukam łatwego sposobu, aby sprawdzić, czy mam wszystkie potrzebne symbole w czasie kompilacji, być może coś, co mogę dodać do mojego pliku Makefile.
Jednym z rozwiązań, które wymyśliłem, jest uruchomienie skompilowanej biblioteki w nm -C -U
celu uzyskania odszyfrowanej listy wszystkich niezdefiniowanych odniesień. Problem polega na tym, że pojawia się również lista wszystkich odniesień, które znajdują się w innych bibliotekach, takich jak GLibC, do których oczywiście zostanie dołączony link wraz z tą biblioteką podczas składania ostatecznej aplikacji. Byłoby możliwe użycie wyjścia nm
do grep
przez wszystkie moje pliki nagłówkowe i sprawdzenie, czy którakolwiek z nazw odpowiada… ale to wydaje się szalone. Z pewnością nie jest to rzadki problem i istnieje lepszy sposób jego rozwiązania?
nm -C -u
uratował mnie wiele razy! (zwróć uwagę na małe litery-u
w moim systemie). Pozostawię ten komentarz tutaj, abym mógł go znaleźć następnym razem, gdy będę go potrzebował.