2015-05-09 8 views
13

Dlaczego skompilowany i połączony plik wykonywalny zawiera ścieżki plików nagłówkowych zawartych w moim kodzie źródłowym? Korzystam z biblioteki wxWidgets i kompiluję ją z Visual Studio 2013 i gcc. Do czego służą te pliki nagłówkowe? Jeśli jest to opcja kompilatora, w jaki sposób mogę ją wyłączyć, aby tego uniknąć?Dlaczego wykonywalny plik binarny zawiera ścieżki dołączonych plików nagłówkowych?

Konfiguracja konfiguracji: zwolnienie, łączenie statyczne.

Example

+0

są to ścieżki do bibliotek, a nie ścieżki do plików nagłówkowych. Podczas kompilacji/połączenia dla dynamicznego łączenia bibliotek, kod musi wiedzieć, gdzie znajduje się biblioteka. Łączenie "statyczne" spowoduje, że kod będzie znacznie większy, ale usunie te ścieżki, ponieważ nie są już potrzebne. – user3629249

Odpowiedz

6

wxWidgets ma wielu twierdzi w swoich plikach nagłówkowych (na przykład w wx/string.h jak zauważyliście), wszystko przy użyciu wxASSERT makra zdefiniowane w wx/debug.h Aby wyłączyć te, można #define wxDEBUG_LEVEL 0 przed tym wszelkie wxWidget nagłówki.

13

Może istnieć kilka wyjaśnień dla takich ciągów pojawiać się w pliku wykonywalnego:

  • Mogłeś debugowania informacji spakowane w pliku wykonywalnego dla debugera w użyciu. Użyj strip, aby to usunąć, lub nie używaj opcji kompilacji -g. Powinieneś także skompilować z NDEBUG zdefiniowanym, aby wyłączyć kod debugowania i asercje. Zazwyczaj ma to miejsce w przypadku trybu Release, ale możesz chcieć dwukrotnie sprawdzić.
  • Niektóre funkcje mogą używać __FILE__ do śledzenia lub rejestrowania. __FILE__ rozwija się do nazwy pliku źródłowego w punkcie rozszerzenia makra, które może być źródłem lub plikiem nagłówkowym. Jedną z takich funkcji jest assert(): w rzeczywistości jest to makro, które rozszerza się do testu i zawiera kod błędu, który zawiera bieżącą nazwę pliku.
  • Niektóre źródła mogą mieć statyczne identyfikatory źródłowe w postaci macierzy static char do śledzenia wersji kodu źródłowego. Takie podejście jest dość przestarzałe, ale wiele starych źródeł wciąż je posiada.

Poszukaj takich rzeczy w plikach źródłowych lub plikach nagłówkowych, których nazwa pojawia się w pliku wykonywalnym i napraw problemy.

+0

Pojedynczy ['assert()'] (http://www.cplusplus.com/reference/cassert/assert/) może być przyczyną (jak na pierwsze dwa motywy listy chqrlie). Kompilacja z 'NDEBUG' może pozbyć się wielu. –

+0

@Hagen von Eitzen: dobry punkt! Zmieniłem odpowiedź. – chqrlie

+0

Próbowałem strip i definiując wxDEBUG_LEVEL jako 0, nie działały. –

Powiązane problemy