2016-10-02 5 views
1

나는 Bison/Flex를 배우고 이미 작성된 C++ 코드를 다운로드하려고했습니다. 이미 생성 된 파서가있는이 (http://www.jonathanbeard.io/tutorials/FlexBisonC++) 문서를 발견했습니다. 지금은Flex와 Bison을 사용하여 Makefile을 CMake로 변환

PROJECT(CTM) 

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

SET(CMAKE_CXX_STANDARD 11) 

FIND_PACKAGE(BISON) 
FIND_PACKAGE(FLEX) 

BISON_TARGET(
    CTMParser 
    mc_parser.yy ${CMAKE_CURRENT_BINARY_DIR}/mc_parser.tab.cpp 
) 

FLEX_TARGET(
    CTMLexer 
    mc_lexer.l ${CMAKE_CURRENT_BINARY_DIR}/mc_lexer.cpp 
) 

ADD_FLEX_BISON_DEPENDENCY(CTMLexer CTMParser) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) 




ADD_EXECUTABLE(ctm  
    main.cpp 
    mc_driver.cpp 

    ${BISON_CTMParser_OUTPUTS} 
    ${FLEX_CTMLexer_OUTPUTS} 
) 

메이크가 잘 작동 파일 CMake이 (작업) 메이크

CC ?= clang 
CXX ?= clang++ 

EXE = my_wc 

CDEBUG = -g -Wall 

CXXDEBUG = -g -Wall 

CSTD = -std=c99 
CXXSTD = -std=c++14 

CFLAGS = -Wno-deprecated-register -O0 $(CDEBUG) $(CSTD) 
CXXFLAGS = -Wno-deprecated-register -O0 $(CXXDEBUG) $(CXXSTD) 


CPPOBJ = main mc_driver 
SOBJ = parser lexer 

FILES = $(addsuffix .cpp, $(CPPOBJ)) 

OBJS = $(addsuffix .o, $(CPPOBJ)) 

CLEANLIST = $(addsuffix .o, $(OBJ)) $(OBJS) \ 
       mc_parser.tab.cc mc_parser.tab.hh \ 
       location.hh position.hh \ 
       stack.hh mc_parser.output parser.o \ 
       lexer.o mc_lexer.yy.cc $(EXE)\ 

.PHONY: all 
all: wc 

wc: $(FILES) 
    $(MAKE) $(SOBJ) 
    $(MAKE) $(OBJS) 
    $(CXX) $(CXXFLAGS) -o $(EXE) $(OBJS) parser.o lexer.o $(LIBS) 


parser: mc_parser.yy 
    bison -d -v mc_parser.yy 
    $(CXX) $(CXXFLAGS) -c -o parser.o mc_parser.tab.cc 

lexer: mc_lexer.l 
    flex --outfile=mc_lexer.yy.cc $< 
    $(CXX) $(CXXFLAGS) -c mc_lexer.yy.cc -o lexer.o 

.PHONY: test 
test: 
    cd test && ./test0.pl 

.PHONY: clean 
clean: 
    rm -rf $(CLEANLIST) 

변환 싶었지만, CMake는 정의되지 않은 참조 오류로 끝납니다.

CMakeFiles/ctm.dir/mc_driver.cpp.o: In function `MC::MC_Driver::parse_helper(std::istream&)': 
mc_driver.cpp:(.text+0x323): undefined reference to `MC::MC_Parser::MC_Parser(MC::MC_Scanner&, MC::MC_Driver&)' 

누군가 나를 도울 수 있습니까? 어떤 답변을 주셔서 감사합니다.

EDIT : C++ 버전을 변경함으로써 해결이

stack.hh:47:9: error: redefinition of default argument for ‘class S’ 
    class stack 
+1

'$ {BISON_CTMParser_OUTPUT} '에 오타가있는 것 같습니다. 복수형입니다. – arrowd

+0

맞아,하지만 지금은 훨씬 더 큰 (재정의) 오류 – Payne

+0

나는 Makefile을 CMake 파일로 변환하는 것이 좋은 생각이라고 생각하지 않는다. 그들은 매우 다릅니다. CMake는 빌드 시스템이 아니라 메타 빌드 시스템 또는 빌드 시스템 파일 생성 프로그램입니다. – usr1234567

답변

1

문제점 점점 변화 오타 후 은 : I는 메이크에서 C++ 14 정의되며 I는 CMake C++ 11가 놓친 ..

PROJECT(CTM) 

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

>>SET(CMAKE_CXX_STANDARD 11) 
<<SET(CMAKE_CXX_STANDARD 14) 

FIND_PACKAGE(BISON) 
FIND_PACKAGE(FLEX) 

BISON_TARGET(
    CTMParser 
    mc_parser.yy ${CMAKE_CURRENT_BINARY_DIR}/mc_parser.tab.cpp 
) 

FLEX_TARGET(
    CTMLexer 
    mc_lexer.l ${CMAKE_CURRENT_BINARY_DIR}/mc_lexer.cpp 
) 

ADD_FLEX_BISON_DEPENDENCY(CTMLexer CTMParser) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) 




ADD_EXECUTABLE(ctm  
    main.cpp 
    mc_driver.cpp 

    ${BISON_CTMParser_OUTPUTS} 
    ${FLEX_CTMLexer_OUTPUTS} 
)