2014-12-12 17 views
6

Có cách nào (ví dụ: các hằng số được xác định) để truy cập các cờ biên dịch mà trình biên dịch được chạy bên trong mã đang được biên dịch hay không.g ++: Có cách nào để truy cập cờ biên dịch bên trong mã đang được biên dịch không?

Ví dụ, tôi muốn một chương trình viết cờ mà nó được biên soạn.

int main(){ 
    std::cout << COMPILE_FLAGS << std::endl; 
} 

Có các hằng số như vậy cho gcc/g ++ không? Hoặc thậm chí tốt hơn: Có hằng số được xác định cả trong gcc và clang?

Tôi đặc biệt quan tâm đến việc kiểm tra cấp độ tối ưu hóa và giá trị của cờ -march. Vì vậy, nếu không có hằng số hiển thị tất cả các cờ, thì có ít nhất các cờ hiển thị các giá trị này không?

+0

Nếu không có gì khác, bạn sẽ có thể kết hợp với nhau bằng cách sử dụng một makefile đồng thời đặt cờ tối ưu hóa và ghi một hằng số vào tệp tiêu đề. – Degustaf

+0

Tôi sẽ cố gắng tìm kiếm trong thông tin gỡ lỗi được lưu trữ với mã, NẾU nó được biên dịch với thông tin đó. Nói chung tôi sẽ nói không có cách nào, bởi vì chúng tôi biên dịch mã máy, và điều này sẽ là thông tin hoàn toàn không cần thiết trong thời gian chạy trong hầu hết các trường hợp. Tôi có nghĩa là hầu hết các lá cờ ảnh hưởng đến những máy-hướng dẫn được lựa chọn và tối ưu hóa có thể được thực hiện, vì vậy bạn có thể suy ra một số cờ từ bản thân mã máy. – midor

Trả lời

1

Sau đây lệnh in ra tất cả các macro được xác định trước:

g++ -dM -E - < /dev/null 

này làm việc với cả hai gcc và g ++. Bạn có thể tự kiểm tra - thật không may, không có macro, cho phép truy cập dễ dàng vào dòng lệnh gcc/g ++ đầy đủ.

May mắn thay, hầu hết các cờ -m ... dẫn đến các macro biên dịch trước đầy đủ được xác định. Ví dụ, -m64 định nghĩa __x86_64-m32 định nghĩa __code_model_32__. Hoặc cho -march: -march = core-avx2 kết quả trong #define __core_avx2__ 1.

Chỉ cần thêm tùy chọn mà bạn cần kiểm tra, trên dòng lệnh ở trên và kiểm tra kết quả cho macro mới xác định.

0

Nếu bạn có thể thay đổi cờ biên dịch hoặc kịch bản mà tạo ra các lệnh biên soạn, bạn có thể thêm một -DCOMPILE_FLAGS = < cờ bạn quan tâm đến> để xây dựng của bạn để thực sự tạo liên tục đó.

Từ GCC manual:

-D name = định nghĩa Nội dung của định nghĩa được tokenized và xử lý, nếu như họ xuất hiện trong giai đoạn dịch ba trong một ‘#define’ chỉ thị . Cụ thể, định nghĩa sẽ được cắt ngắn bằng các ký tự dòng mới được nhúng.

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