2009-11-18 2 views
1

나는 ANTLR을 배우고 this 튜토리얼 (this 질문에서도 사용됨)을 사용하여 C 출력 코드로 작업하려고 노력했습니다. 성공적으로 C 소스로 lexer와 parser를 생성하는 ANTLR을 얻었지만 Mac OS X Snow Leopard (i686-apple-darwin10-gcc-4.2.1)에서 gcc를 사용하여 컴파일 할 수 없습니다. 아래는 "SimpleCalcLexer.c"를 컴파일하려고했을 때의 결과입니다.C에서 ANTLR 3 문법 컴파일

dyn-72-33-132-199:Desktop bf$ gcc -o lexer SimpleCalcLexer.c 
Undefined symbols: 
    "_main", referenced from: 
     start in crt1.10.6.o 
    "_antlr3LexerNewStream", referenced from: 
     _SimpleCalcLexerNewSSD in ccjXa6NU.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

SimpleCalcLexer.c 파일을 참조하지 않습니다는 "주"어디 (도 아니다 정의), 그러나 파서 그것을 정의 않기 때문에 나는 컴파일하려고 :

dyn-72-33-132-199:Desktop bf$ gcc -o parser SimpleCalcParser.c 
Undefined symbols: 
    "_antlr3CommonTokenStreamSourceNew", referenced from: 
     _main in ccn8ZVhk.o 
    "_antlr3ParserNewStream", referenced from: 
     _SimpleCalcParserNewSSD in ccn8ZVhk.o 
    "_SimpleCalcLexerNew", referenced from: 
     _main in ccn8ZVhk.o 
    "_antlr3AsciiFileStreamNew", referenced from: 
     _main in ccn8ZVhk.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

그래서를 몇 가지 질문 :
1) 내가 뭘 잘못하고 있니? 다른 antlr 함수와 정의가 코드에서 발견되므로 라이브러리가 발견되고 있음을 확신합니다. gcc가 잘못 호출 되었습니까? (이전에 명령 행에서이 콤플렉스를 컴파일 한 적이 전혀 없습니다.) 2) ccn8ZVhk.o은 무엇입니까? 나는 이것이 객체 코드 파일이라는 것을 알 수 있지만, 내 시스템에서 찾을 수 없다. (locatemdfind).

답변

4

렉서와 파서를 동일한 실행 파일로 컴파일해야합니다. 그들은 하나의 프로그램을 만들기 위해 함께 일합니다. 이 시도 : 라인은 다음 렉서와 파서를 컴파일 할 명령

gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c 

ANTLR 라이브러리 (이하 "-lantlr3c"부분)과 결과를 연결합니다.

오브젝트 파일 ccn8ZVhk.o는 런타임 라이브러리의 일부이며 실제로 main()을 호출합니다. 여기에는 사용자가 처리 할 수있는 부품이 포함되어 있지 않습니다.

+1

고마워요! "-lantlr3c"플래그는 내가 누락 된 플래그입니다. 라이브러리가 32 비트 전용이기 때문에 "-arch i386"이 필요하다는 것을 알았고 Snow Leopard gcc는 내 컴퓨터에서 64 비트를 컴파일하려고합니다. – CajunLuke

0

여러 번 컴파일하면 오브젝트 코드 파일 이름이 매번 변경되므로 최종 대상이 컴파일되고 링크되기 전에 사용되는 임시 오브젝트 파일이라고 생각됩니다. 나는 같은 문제를 겪고 있는데, 아키텍처를 386과 686으로 지정하려고 시도했다. 나는이 Python3 grammar file의 결과를 컴파일하려고 시도하고있다. CajunLuke, 일했을 때 컴파일 할 때 사용한 명령을 정확하게 게시 할 수 있습니까? "설치 확인;하게 구성"

또한
WOPR:plex pokstad$ gcc -arch i686 -o lexer python3Lexer.c python3Parser.c -lantlr3c 
Undefined symbols: 
"_main", referenced from: 
    start in crt1.10.6.o 
"_python3Lexer_syntetizeEmptyString", referenced from: 
    _mLEADING_WS in ccGDusga.o 
"_python3Lexer_createLexerToken", referenced from: 
    _mCONTINUED_LINE in ccGDusga.o 
    _mLEADING_WS in ccGDusga.o 
"_python3Lexer_initLexer", referenced from: 
    _python3LexerNewSSD in ccGDusga.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

, 당신은 평소와 다르게 ANTLR3C 런타임 컴파일 않은 : 여기에 내가 한 일의 샘플입니까? 64 비트 옵션을 사용하여 컴파일을 시도했지만 동일한 문제가있었습니다.

+1

나는 표준 구성을 사용한다고 확신한다. make; make install sequence (나는 정말로 기억하지 않는다). 렉서와 파서 만 컴파일하기 때문에 오류가 발생합니다. 다른 두 파일을 추가해야합니다 (lexer 유틸리티와 main() 함수가있는 테스트 프로그램). 다음은 필요한 명령입니다. $ gcc -arch i686 -o lexer python3lexer.c python3parser.c python3lexerutils. c test_cpython3.c -lantlr3c 본질적으로 내가 사용했던 것이지만 내 main() 함수는 렉서에 포함되어 있습니다. 모든 파일이 같은 폴더에 있다고 가정합니다. – CajunLuke

+0

굉장, 고마워! – pokstad

+0

현재 제공되는 명령을 사용하여 아키텍처를 지정하지 않고 성공적으로 컴파일 할 수있었습니다. 다음 명령을 사용하여 컴파일하기 전에 ANTLR3C 런타임을 64 비트 사용 가능으로 구성하는 것이 트릭입니다. "./ configure --enable-64bit "일부 int 데이터 유형이 잘못된 크기이지만 성공적으로 컴파일 된 것 이외의 경고가있었습니다 .Xcode가 32 비트를 생성 할 수 있기 때문에 32 비트 시스템에서이 작업과 같은 64 비트 응용 프로그램을 만드는 방법을 알고 싶습니다/64bit 유니버설 바이너리들이지만, 나는 그걸 멀리 할 때 새로운 질문을 남겨 둘 것입니다! – pokstad