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"명령을 실행하고 출력을 구문 분석 할 수 있다는 것을 알고 있지만 위의 예와 같이 보다 ' 신뢰할 수있는 ' 것을 찾고있었습니다 .

답변:




3

gcc 로는 불가능하지만 tcc (임베디드 가능한 C 컴파일러)는 당신이 생각하는 것에 충분할 것입니다. 배포판에는 libtcc 라이브러리가 제공되어 C 코드를 컴파일, 링크 및 실행할 수 있습니다.

이것은 C에만 해당되며 귀하의 질문에도 C ++ 태그가 지정되어 있지만 C ++에 대한 tcc에 해당하는 것은 없습니다.


공지 tcc빠르게 컴파일하지만 전혀 최적화되지 않습니다. 생성 된 코드는 종종 생성하는 코드보다 3-10 배 느립니다 gcc -O2.
Basile Starynkevitch

2

gcc를 포크하는 것보다 더 좋은 것이 있는지 의심합니다. 이런 종류의 사용을 위해 설계된 clang을 고려할 수 있습니다.


2

(Linux 또는 MacOSX와 같은 POSIX 시스템에 있다고 생각합니다)

당신은 분명히으로 보일 것입니다 GCCJIT 로, 치로 틸리 언급 . 그런 다음 생성 된 코드의 AST 와 유사한 표현을 작성합니다. 물론 당신은 고려해 볼 수 있습니다 LLVM을 대신하거나, 심지어 간단한 JIT의 같은 라이브러리 libjit 또는 GNU 번개 (그러나 libjit하고 lightning신속하게 코드를 방출하지만 방출 된 코드는 느리고 최적화되지 않은 것입니다).

그러나 여전히 임시 파일에서 일부 C 코드 를 내보내고 컴파일하는 것을 고려할 수도 있습니다 (예 : dlopen (3) & dlsym (3)을 사용하여 나중에 플러그인으로 동적으로로드하는 공유 라이브러리 ), 여기여기를 참조 하십시오 자세한 내용은.

중요한 사실 : 최적화 된 코드를 생성 gcc -O2하는 것은 어려운 작업이므로 CPU 시간 (GCCJIT 또는 LLVM 사용 또는 실행 ) 이 소요 됩니다. 따라서 gcc프로세스 를 포크하는 (또는 같은 다른 컴파일러를 사용 하는) 오버 헤드 clang는 무시할 수 있습니다 (GCCJIT 또는 LLVM과 같은 일부 라이브러리를 사용하는 경우).

실제로, 내 경험 ( GCC MELT )은 현재 데스크탑 및 랩톱에서 수백 줄의 C 코드를 방출하고 컴파일하는 것이 사용자 상호 작용과 호환되기에 충분히 빠릅니다 (1 ~ 2/10 초)입니다. 그래서 오늘, 당신은 그것을 할 REPL 을 갖는 것을 고려할 수 있습니다. 관련 답변을 참조하십시오 .

모든 REPL 상호 작용에서 기계 코드로 컴파일되는 구현 인 Common LispSBCL 도 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.