gpt4 book ai didi

c++ - 为cmake生成文件

转载 作者:行者123 更新时间:2023-11-28 03:35:50 25 4
gpt4 key购买 nike

我有一个带有 automake 构建系统的项目,那里有 flex/bison 文件。现在我不明白如何将它们包含到 cmake 构建系统中。我正在尝试手动执行此操作。这是项目树:

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

Flex 文件夹中有 2 个文件:player_command_parser.ypp; player_command_tok.lpp。这些文件来自 RoboCup soccer server .

我真的不知道如何在新的构建系统中使用它们,所以我决定手动生成所有文件:

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 -> Includes,并将 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’

有什么问题吗?

最佳答案

您的编译错误似乎是由于某些 header 被包含了两次。您可能需要制作一个额外的文件,该文件只不过是一个包含保护:

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)

然后像往常一样将文件添加到文件列表中。

关于c++ - 为cmake生成文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10911855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com