Mã nhị phân gcc
thúc đẩy quá trình biên dịch bằng cách gọi một số chương trình khác theo thứ tự thực sự thực hiện các giai đoạn khác nhau của công việc (biên dịch, lắp ráp, liên kết).
Khi bạn nói:
gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...
bạn đang yêu cầu nó để chạy các nguồn thông qua tiền xử lý C, và sau đó chạy kết quả thông qua việc lắp ráp.
Bước tiền xử lý C sẽ biến:
.ifdef MACRO_FROM_CMDLINE
thành:
.ifdef 1
trước khi đi qua nó vào lắp ráp, mà sau đó không thể làm cho tinh thần của nó. Đây là lý do bạn gặp lỗi "số nhận dạng không hợp lệ". Nó cũng giải thích tại sao sử dụng tiền xử lý trước #ifdef
khắc phục sự cố.
--defsym
không hoạt động vì nó là một tùy chọn để lắp ráp, không phải là chương trình điều khiển gcc
. (Người tài xế gcc
không hiểu và đi qua một số tùy chọn để một số trong những chương trình đó gọi, nhưng không phải tất cả.)
Bạn thể Tuy nhiên, vượt qua tùy chọn tùy ý thông qua các lắp ráp bằng cách sử dụng
-Wa,option[,option...]
cú pháp, thông báo cho trình điều khiển gcc
chuyển các tùy chọn đó đến bộ lắp ráp (dưới dạng danh sách tùy chọn được phân cách bằng dấu cách).
Ví dụ:
gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...
thêm
--defsym MACRO_FROM_CMDLINE=1
vào danh sách các tùy chọn truyền cho as
khi gcc
gọi nó, và đó là cách để làm cho ban công .ifdef
ví dụ của bạn.
Bạn có thể xem các chương trình cá nhân gọi bởi gcc
, và các tùy chọn nó thực sự đi với họ, bằng cách thêm tùy chọn -v
.
Trong trường hợp này, bạn sẽ thấy một cái gì đó gọi là cc1
(thực tế GCC C biên dịch nhị phân) gọi với -E
cờ (preprocess chỉ) để preprocess đầu vào vào một tập tin tạm thời, và sau đó as
gọi vào tập tin tạm thời để lắp ráp nó.
Tôi xác nhận rằng -Wa, các tùy chọn được mô tả bởi Mat ở trên hoạt động khá tốt. – Raj