【问题标题】:Converting Makefile to CMake using Flex and Bison使用 Flex 和 Bison 将 Makefile 转换为 CMake
【发布时间】:2017-02-10 17:12:40
【问题描述】:

我正在学习 Bison/Flex 并想下载已经制作的 C++ 代码。我发现这篇 (http://www.jonathanbeard.io/tutorials/FlexBisonC++) 文章已经创建了解析器。现在我想转换这个(工作)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)

到 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 工作正常,但 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&)'

有人可以帮助我吗?感谢您的任何回答。

编辑: 更改错字后,得到这个

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

【问题讨论】:

  • 您在${BISON_CTMParser_OUTPUT} 中似乎有错字。它是复数。
  • 你是对的,但现在我的(重新定义)错误越来越大了
  • 我认为将 Makefile 转换为 CMake 文件不是一个好主意。它们非常不同。 CMake 不是构建系统,而是元构建系统或构建系统文件生成器。
  • 这对我未来的项目扩展很有帮助......但是,是的,这并不是真正的必需品。

标签: c++ makefile cmake bison flex-lexer


【解决方案1】:

通过更改 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}
)

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2013-05-15
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多