0

automakeビルドシステムを使用したプロジェクトがあり、そこにflex/bisonファイルがあります。今、私はそれらをcmakeビルドシステムに含める方法を理解できません。私はこれを手動で行おうとしています。プロジェクトツリーは次のとおりです。

+ROOT
|---CMakeLists.txt
|---Sources/
|   |---Flex
|   |---Main
|   |---CMakeLists.txt
|---Includes/

Flexフォルダには2つのファイルがあります:player_command_parser.ypp; player_command_tok.lpp。これらのファイルはRoboCupサッカーサーバーからのものです。

新しいビルドシステムでそれらを使用する方法がよくわからないので、すべてのファイルを手動で生成することにしました。

flex --c++ player_command_tok.lpp 

このコマンドlex.RCSSPCom.ccは、次のコードで始まるを生成します。

#line 3 "lex.RCSSPCom.cc"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

    /* The c++ scanner is a mess. The FlexLexer.h header file relies on the
     * following macro. This is required in order to pass the c++-multiple-scanners
     * test in the regression suite. We get reports that it breaks inheritance.
     * We will address this in a future release of flex, or omit the C++ scanner
     * altogether.
     */
    #define yyFlexLexer RCSSPComFlexLexer

次のステップは次のとおりbison -d player_command_parser.yppです。

私が得た:player_command_parser.tab.cpp; player_command_parser.tab.hpp

今、私は生成されたすべてのファイルを関連するフォルダーにコピーしようとしています:*。tab.hpp->インクルード、およびcc&cppファイルを次の場所に追加しましたSources/CMakeLists.txt

set (FlexSources
    Server/Flex/lex.RCSSPCom.cc
    Server/Flex/player_command_parser.tab.cpp
)

そしてコンパイル出力:

[  1%] Building CXX object Sources/Flex/lex.RCSSPCom.cc.o
In file included from /Includes/player_command_tok.h:31:0,
                 from player_command_tok.lpp:28:
/usr/include/FlexLexer.h:112:7: error: redefinition of ‘class RCSSPComFlexLexer’
/usr/include/FlexLexer.h:112:7: error: previous definition of ‘class RCSSPComFlexLexer’

何が間違っている可能性がありますか?

4

1 に答える 1

2

コンパイル エラーは、一部のヘッダーが 2 回含まれていることが原因のようです。インクルードガードに過ぎない追加のファイルを作成する必要がある場合があります。

player_command_tok_guarded.hpp:

#ifndef PLAYER_COMMAND_TOK_GUARDED
#define PLAYER_COMMAND_TOK_GUARDED
#include "player_command_tok.hpp"
#endif

代わりに、ファイルを#includeこの新しいファイルにします。flex と bison を CMake システムに統合するには、次のようにしてみてください。

# Find flex and bison.
find_program(FLEX flex DOC "Path to the flex lexical analyser generator.")
if(NOT ${FLEX})
  message(SEND_ERROR "Flex not found.")
endif
find_program(BISON bison DOC "Path to the bison parser generator.")
if(NOT ${BISON})
  message(SEND_ERROR "Bison not found.")
endif

# Custom commands to invoke flex and bison.
add_custom_command(OUTPUT lex.RCSSPCom.cc
                   COMMAND ${FLEX} --c++ player_command_tok.lpp 
                   MAIN_DEPENDENCY player_command_tok.lpp
                   COMMENT "Generating lexer"
                   VERBATIM)
add_custom_command(OUTPUT player_command_parser.tab.cpp player_command_parser.tab.hpp
                   COMMAND ${BISON} -d player_command_parser.ypp
                   MAIN_DEPENDENCY player_command_parser.ypp
                   COMMENT "Generating parser"
                   VERBATIM)

通常どおり、ファイルをファイル リストに追加します。

于 2012-06-12T11:01:47.463 に答える