มีวิธีการใช้ gcc เป็นห้องสมุดหรือไม่?


10

ทุกคนรู้วิธีแก้ปัญหาที่ใช้งานได้เช่นนี้:

#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;
}

ฉันรู้ว่าฉันสามารถเรียกใช้คำสั่ง "gcc main.c -o main" ในทางแยกและแยกวิเคราะห์ผลลัพธ์ ... แต่ฉันกำลังมองหาบางสิ่งที่ ' เชื่อถือได้ ' เช่นตัวอย่างด้านบน

คำตอบ:


10

GCC ได้รับการออกแบบอย่างชัดเจนเพื่อต้านทานการใช้งานเป็นฐานเครื่องมือ / ไลบรารี คุณต้องใช้เสียงดังกราวสำหรับสิ่งนี้หรือโทร GCC ผ่าน commandline


3
คุณรู้สาเหตุของการตัดสินใจออกแบบนั้นหรือไม่?
Max

libgccjitคือการทำงานไปในทิศทางที่แม้ว่ามันจะมีการต่อสู้ขึ้น: programmers.stackexchange.com/a/323821/124651
Ciro Santilli冠状病毒审查六四事件法轮功


3

มันเป็นไปไม่ได้กับ gcc แต่คุณอาจพบว่าtcc (คอมไพเลอร์ C แบบฝังได้) ดีพอสำหรับสิ่งที่คุณมีอยู่ในใจ การแจกจ่ายมาพร้อมกับไลบรารี libtcc ที่อนุญาตให้รวบรวมเชื่อมโยงและเรียกใช้รหัส C "ในทันที"

โปรดทราบว่าสำหรับ C เท่านั้นคำถามของคุณจะถูกแท็ก C ++ เช่นกัน แต่ฉันไม่เห็นรายการใด ๆ ที่เทียบเท่ากับ tcc สำหรับ C ++


สังเกตว่าtccคอมไพล์อย่างรวดเร็ว แต่ไม่ได้ปรับให้เหมาะสมเลย รหัสที่สร้างมักจะช้ากว่าสิ่งที่gcc -O2จะสร้าง3 ถึง 10 เท่า
Basile Starynkevitch

2

ฉันสงสัยว่ามีอะไรดีกว่าการฟอร์ก gcc คุณอาจพิจารณาเสียงดังกราวซึ่งออกแบบมาสำหรับการใช้งานประเภทนี้มากกว่า


2

(ฉันเดาว่าคุณอยู่ในระบบ POSIX บางระบบเช่น Linux หรือ MacOSX)

เห็นได้ชัดว่าคุณควรมีลักษณะเป็นGCCJITเป็นที่กล่าวถึงโดย Ciro Santilli จากนั้นคุณจะสร้างAST ที่คล้ายกับรหัสที่สร้างขึ้น แน่นอนคุณอาจพิจารณาLLVMแทนหรือแม้แต่ห้องสมุดJIT ที่ง่ายกว่าเช่นlibjitหรือGNU Lightning (แต่libjitและlightningจะปล่อยรหัสอย่างรวดเร็ว แต่รหัสที่ปล่อยออกมานั้นช้าและไม่มีการเร่งความเร็ว)

อย่างไรก็ตามคุณอาจพิจารณาปล่อยรหัส C บางส่วนในไฟล์ชั่วคราวและฟอร์กการรวบรวมมัน (เช่นเป็นไลบรารีที่ใช้ร่วมกันซึ่งคุณจะโหลดในภายหลังเป็นปลั๊กอินโดยใช้dlopen (3) & dlsym (3) ) ดูที่นี่ & ที่นี่สำหรับรายละเอียด

สังเกตุข้อเท็จจริงที่สำคัญ: การสร้างโค้ดที่ได้รับการปรับปรุงให้ดีที่สุดต้องใช้เวลาของ CPU (ด้วย GCCJIT หรือ LLVM หรือโดยการรันgcc -O2) เนื่องจากเป็นงานที่ยาก ดังนั้นค่าโสหุ้ยการฟอร์กgccกระบวนการ (หรือการใช้คอมไพเลอร์อื่น ๆ เช่นclang) จึงเล็กน้อย (wrt โดยใช้ไลบรารี่บางอย่างเช่น GCCJIT หรือ LLVM)

ที่จริงแล้วประสบการณ์ของฉัน (ในGCC MELT ) คือบนเดสก์ท็อปและแล็ปท็อปในปัจจุบันปล่อยโค้ด C สองสามร้อยบรรทัดและการฟอร์กการคอมไพล์ของพวกเขานั้นเร็วพอ (หนึ่งหรือสองสิบวินาที) เพื่อให้เข้ากับการโต้ตอบกับผู้ใช้ ดังนั้นวันนี้คุณสามารถพิจารณามีREPLซึ่งจะทำเช่นนั้น ดูคำตอบที่เกี่ยวข้องนี้ด้วย

ดูที่Common LISPและSBCLซึ่งเป็นการนำไปใช้ซึ่งรวบรวมเป็นรหัสเครื่องในทุก ๆ การโต้ตอบของ REPL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.