2012-07-20 24 views
8

Khi biên dịch dự án của tôi với clang ++, đường dẫn đến tệp nguồn dường như không được bao gồm trong mã đối tượng. Điều này có nghĩa là gdb không thể tìm thấy tệp nguồn để hiển thị mã. Đối với các trường hợp cụ thể, tôi có thể sử dụng lệnh g2's directory để thêm một thư mục, nhưng dự án của tôi có rất nhiều thư mục nguồn và điều này gây phiền toái rất nhanh.gdb không tìm thấy tệp nguồn được biên dịch bởi clang ++

Khi tôi chuyển cấu hình của mình để sử dụng g ++, gdb chỉ tìm tất cả các tệp nguồn của tôi.

Chức năng này hoạt động clang ++ 2.9 trên Snow Leopard, nhưng không hoạt động với clang ++ 3.1 trên Lion. Tôi có XCode 4.3.2.

Có tùy chọn kêu gọi buộc đường dẫn đầy đủ được sử dụng trong tệp đối tượng không? Có thể cái gì khác sai với cấu hình của tôi?

+0

Tôi không chắc chắn nhưng bạn đã thực hiện '-d' chưa? –

+0

@NeelBasu Các tệp nguồn của tôi được trải rộng trên 40 thư mục và tôi không muốn sử dụng '-d' 40 lần. – robert

Trả lời

4

Tôi đã phát hiện ra điều này: vấn đề xảy ra khi xây dựng các dự án với các tệp makefiles phân cấp. Nếu một thư mục con đã được xây dựng từ một thư mục mẹ (trong makefile của tôi: make -w -C sub-dir) thì gdb không thể mở tệp nguồn. Khi thay đổi vào thư mục con và gọi điện thoại chỉ cho thư mục này thì gdb tìm nguồn. Bạn có thể xác minh điều này bằng cách tìm kiếm đường dẫn xây dựng trong các tệp đối tượng đã tạo. Tôi đã sử dụng strings object-file | grep $HOME.

Tôi cũng nhận thấy: điều này không xảy ra đối với một tệp đối tượng: tệp này chưa được biên dịch bằng CC. Tệp này đã được biên dịch với esql. Cuối cùng, esql gọi CC.

Đó là lý do tại sao tôi đã thử cách này: không gọi clang trực tiếp từ thực hiện. Gọi clang từ một kịch bản lệnh shell.

$ cat ~/bin/mycc 

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

$ export CC=mycc 
$ make 

Hoan hô! gdb mở tệp nguồn!

BTW: thay thế make -w -C sub-dir bởi (cd sub-dir;make -w) là một cách giải quyết khác.

+0

Điều này thật thú vị, nhưng tôi sử dụng [waf] (https://code.google.com/p/waf/), trong đó các nguồn được bao gồm theo cách phân cấp, nhưng bản thân waf không phải là phân cấp. – robert

+0

Đã xác minh: đã phê duyệt một dự án nhỏ. Sử dụng waf để xây dựng dự án. gdb không thành công: '1 \t ../dir1/foo.c: Không có tệp hoặc thư mục nào như vậy.'. Sau khi xây dựng lại dự án với: 'CC = mycc ./waf-1.6.1 cấu hình build' vấn đề đã biến mất:' (gdb) danh sách chính int main() { return 0; } ' – Rene

+0

Tôi sẽ thử điều đó. – robert

Các vấn đề liên quan