2012-07-20 14 views
8

Podczas kompilowania mojego projektu z clang ++, ścieżka do plików źródłowych najwyraźniej nie jest zawarta w kodzie obiektowym. Oznacza to, że gdb nie może znaleźć plików źródłowych do wyświetlenia kodu. W określonych przypadkach mogę użyć polecenia gdb directory, aby dodać katalog, ale mój projekt zawiera wiele katalogów źródłowych, co bardzo szybko staje się denerwujące.gdb nie znajduje plików źródłowych skompilowanych przez clang ++

Kiedy przełączam konfigurację na g ++, gdb znajduje wszystkie moje pliki źródłowe.

Ta funkcja zadziałała ++ ++ 2.9 na Snow Leopard, ale nie działa z clang ++ 3.1 na Lion. Mam XCode 4.3.2.

Czy istnieje opcja klang, która wymusza używanie pełnych ścieżek w plikach obiektów? Czy coś może być nie tak z moją konfiguracją?

+0

Nie jestem pewien, ale czy zrobiłeś '-d'? –

+0

@NeelBasu Moje pliki źródłowe są rozłożone na 40 katalogów i wolę nie używać '-d' 40 razy. – robert

Odpowiedz

4

Odkryłem: problem pojawia się podczas tworzenia projektów z hierarchicznymi plikami Makefile. Jeśli podkatalog został zbudowany z katalogu nadrzędnego (w moim pliku Makefile: make -w -C sub-dir), to gdb nie może otworzyć pliku źródłowego. Po przejściu do podkatalogu i wywołaniu make tylko dla tego katalogu, gdb odnajduje źródło. Możesz to sprawdzić, przeszukując ścieżkę kompilacji w wygenerowanych plikach obiektów. Użyłem strings object-file | grep $HOME.

Zauważyłem też: nie stało się to dla jednego pliku obiektowego: ten plik nie został skompilowany z CC. Ten plik został skompilowany z esql. Na końcu esql wywołuje CC.

Dlatego próbowałem tego rozwiązania: nie wywołuj klang bezpośrednio z marki. Zadzwoń do klang ze skryptu powłoki.

$ cat ~/bin/mycc 

/usr/bin/cc "[email protected]" 

$ export CC=mycc 
$ make 

Hurra! gdb otwiera pliki źródłowe!

BTW: kolejnym rozwiązaniem jest zastąpienie make -w -C sub-dir przez (cd sub-dir;make -w).

+0

Jest to interesujące, ale używam [waf] (https://code.google.com/p/waf/), w którym źródła są ujęte w sposób hierarchiczny, ale sam Waf nie jest hierarchiczny. – robert

+0

Zweryfikowano: utworzono mały projekt. Wykorzystanie waf do zbudowania projektu. gdb zawiedzie: '1 \t ../dir1/foo.c: Brak takiego pliku lub katalogu'. Po przebudowaniu projektu za pomocą: 'CC = mycc ./waf-1.6.1 configure build' problem zniknął:' '' '' gdb '' lista główna int main() { return 0; } ' – Rene

+0

Spróbuję tego. – robert

Powiązane problemy