Có cách nào để sử dụng gcc làm thư viện không?


10

Bất cứ ai cũng biết một giải pháp hoạt động như thế này:

#include <stdio.h>
#include <gcc.h> /* This .h is what I'm looking for. */

int main (void) {
    /* variables declaration (...) */

    /* The following line is supposed to be equivalent to:
     *     $ gcc main.c -o main */
    results = gcc_compile_and_link("main.c", "main");

    /* Now I want to use the warnings and errors to do something.
     * For instance, I'll print them to the console: */
    printf("warnings:\n");
    for (i=0; i<results.warns_len; i++)
        printf("%s\n", results.warings[i].msg);
    printf("errors\n");
    for (i=0; i<results.errs_len; i++)
        printf("%s\n", results.errors[i].msg);

    /* free memory and finalize (...) */
    return 0;
}

Tôi biết tôi có thể chạy lệnh "gcc main.c -o main" trong một ngã ba và phân tích đầu ra ... nhưng tôi đang tìm kiếm thứ gì đó " đáng tin cậy " hơn như ví dụ trên.

Câu trả lời:


10

GCC được thiết kế rõ ràng để chống lại việc sử dụng làm cơ sở / thư viện công cụ. Bạn cần sử dụng Clang cho việc này hoặc gọi GCC thông qua dòng lệnh.


3
Bạn có biết lý do cho quyết định thiết kế đó?
Tối đa

libgccjitđang làm việc theo hướng đó, mặc dù nó sẽ là một trận chiến khó khăn: lập trình
viên.stackexchange.com/a/323821/124651


3

Không thể với gcc nhưng bạn có thể thấy tcc (trình biên dịch C có thể nhúng) đủ tốt cho những gì bạn có trong đầu. Bản phân phối đi kèm với một thư viện libtcc cho phép biên dịch, liên kết và chạy mã C "một cách nhanh chóng".

Lưu ý rằng điều này chỉ dành cho C, câu hỏi của bạn cũng được gắn thẻ C ++ nhưng tôi chưa thấy tương đương với tcc cho C ++.


Lưu ý rằng tccbiên dịch nhanh, nhưng không tối ưu hóa chút nào. Mã được tạo ra thường chậm hơn 3 đến 10 lần so với những gì gcc -O2sẽ tạo ra.
Basile Starynkevitch

2

Tôi nghi ngờ không có gì tốt hơn so với gcc. Bạn có thể xem xét tiếng kêu, được thiết kế nhiều hơn cho loại sử dụng này.


2

(Tôi đoán bạn đang ở trên một số hệ thống POSIX, như Linux hoặc MacOSX)

Bạn rõ ràng nên xem xét GCCJIT , như được đề cập bởi Ciro Santilli . Sau đó, bạn sẽ xây dựng một số đại diện giống như AST của mã được tạo. Tất nhiên bạn có thể xem xét LLVM thay vào đó, hoặc thậm chí một số đơn giản JIT thư viện như libjit hoặc GNU sét (nhưng libjitlightningđang phát mã nhanh chóng, nhưng mã phát ra là chậm và được tối ưu hóa).

Tuy nhiên, bạn vẫn có thể xem xét việc phát ra một số mã C trong một tệp tạm thời và yêu cầu biên dịch nó (ví dụ như thư viện dùng chung mà sau này bạn sẽ tải động một cách linh hoạt dưới dạng plugin bằng dlopen (3) & dlsym (3) ), xem tại đây & tại đây để biết chi tiết.

Lưu ý một thực tế quan trọng: việc tạo mã được tối ưu hóa cần có thời gian của CPU (với GCCJIT hoặc LLVM hoặc bằng cách chạy gcc -O2) vì đây là một nhiệm vụ khó khăn. Vì vậy, chi phí cho việc tạo ra một gccquá trình (hoặc sử dụng một số trình biên dịch khác, như clang) là không đáng kể (wrt sử dụng một số thư viện như GCCJIT hoặc LLVM).

Trên thực tế, kinh nghiệm của tôi (trong GCC MELT ) là trên máy tính để bàn và máy tính xách tay hiện tại, phát ra vài trăm dòng mã C và yêu cầu biên dịch chúng đủ nhanh (một hoặc hai phần mười giây) để tương thích với tương tác của người dùng. Vì vậy, ngày hôm nay, bạn có thể xem xét có REPL sẽ làm điều đó. Xem thêm câu trả lời liên quan này .

Cũng xem xét Common LispSBCL , đây là một triển khai biên dịch thành mã máy ở mỗi lần tương tác REPL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.