简体   繁体   English

使用 Flex 和 Bison 将 Makefile 转换为 CMake

[英]Converting Makefile to CMake using Flex and Bison

I'm learning Bison/Flex and wanted to download already made C++ code.. I found this ( http://www.jonathanbeard.io/tutorials/FlexBisonC++ ) article with already created parser.我正在学习 Bison/Flex 并想下载已经制作的 C++ 代码。我发现这篇( http://www.jonathanbeard.io/tutorials/FlexBisonC++ )文章已经创建了解析器。 Now i wanted convert this (working) Makefile现在我想转换这个(工作)Makefile

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)

to the CMake file到 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}
)

Makefile works fine, but CMake ends with undefined reference error. 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&)'

Can somebody help me?有人可以帮助我吗? Thanks for any answer.感谢您的任何回答。

EDIT: After change typo, getting this编辑:更改错字后,得到这个

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

Problem solved by changing C++ version :) I missed that in Makefile is defined C++14 and I have in CMake C++11..通过更改 C++ 版本解决了问题 :) 我错过了在 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}
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM