2016-10-02 5 views
1

私はBison/Flexを学んでいて、すでに作成されたC++コードをダウンロードしたいと思っています。これは既に作成されたパーサを持つこの(http://www.jonathanbeard.io/tutorials/FlexBisonC++)の記事を見つけました。今、私はCMakeのこの(作業)MakefileのフレックスとBisonを使ってMakefileを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) 

を変換したかった

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} 
) 

Makefileは正常に動作しますが、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

問題を取得し、変更タイプミスした後 は、:)私はMakefileの中でC++ 14に定義されていると私は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} 
) 
関連する問題