2012-02-10 38 views
5

Tôi có tệp nguồn mà tôi tiền xử lý bằng cách sử dụng các tùy chọn -E-P (sử dụng GCC 4.1.2 cho nền tảng nhúng dựa trên vxWorks). Tất cả các tùy chọn khác đều giống như khi tôi biên dịch tệp. Các tùy chọn này là:Biên dịch các thay đổi tệp trước khi xử lý trước đó xuất ra

-Wall 
-march=pentium 
-nostdinc 
-O0 
-fno-builtin 
-fno-defer-pop 
-g 
-c 
-o 

cũng như tất cả đường dẫn bao gồm. Bây giờ khi tôi biên dịch tệp được xử lý trước này, tệp đối tượng kết quả nhỏ hơn nhiều (khoảng 30%) so với khi tôi biên dịch bản gốc trực tiếp. Và khi tôi liên kết chương trình, trình liên kết phàn nàn về các ký hiệu bị thiếu (tất cả trong mã người dùng), điều này không xảy ra khi sử dụng tệp nguồn gốc. Tại sao lại có một sự khác biệt? Có cách nào để thực hiện công việc này không?

Trả lời

1

Bạn chắc chắn mình không thiếu bất kỳ -D nào được xác định từ dòng lệnh của mình? Kết quả của bạn sẽ nhất quán với các phần không được biên soạn do điều kiện.

Một khả năng khác (vì bạn không đặt tên cho trình biên dịch cụ thể) là bạn đang sử dụng chung gcc -E thay vì trình biên dịch chéo dành riêng cho môi trường vxWorks của bạn. The cross-gcc sẽ xác định trước một số biến mà bạn sẽ cần cho gcc -E.

+0

Tôi đang sửa đổi quy tắc tạo tệp đối tượng bằng cách thêm cờ '-E'- và' -P', mà không xóa bất kỳ thứ gì, vì vậy tôi chắc chắn rằng tôi đang sử dụng trình biên dịch chính xác và có tất cả định nghĩa. –

1

Khi biên dịch đầu ra được xử lý trước, hãy thử chuyển tùy chọn -fpreprocessed để yêu cầu GCC không được xử lý trước.

Sự khác biệt duy nhất tôi có thể nghĩ là macro dẫn đến việc mở rộng đến số nhận dạng là tên macro đã được mở rộng - bộ tiền xử lý ngừng mở rộng tại thời điểm đó, nhưng nếu bạn chạy trình xử lý trước một lần nữa, số nhận dạng sẽ là mở rộng một lần nữa. Tôi đã có thể mong đợi bất kỳ trường hợp này có thể gây ra một lỗi trình biên dịch, nhưng ai biết được?

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