【发布时间】:2022-01-04 16:36:49
【问题描述】:
我正在使用 flex 和 bison 使用 C++ 开发一个爱好项目。我使用 CMake 作为我的构建系统,我很难让所有的东西一起工作。
我对 CMake 很陌生,所以 documentation 对我来说似乎很小。它展示了如何将所有内容链接到一个可执行文件中。
但我试图将代码的所有部分分开,所以我想将我的 flex/bison 文件放在子文件夹中。我的结构是这样的:
.
├── build
| └-- ...
├── CMakeLists.txt
├── flexbison
│ ├── CMakeLists.txt
│ ├── lexer.ll
│ └── parser.yy
├── lib
│ ├── CMakeLists.txt
│ └── ...
├── main.cpp
└── run.sh
所以我想让我的yyparse 函数与我的main.cpp 以及我的其他 C++ 文件分开。我设法以这种方式完成了它:
-
project_root/CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
# set the project name
project(progetto-di-prova VERSION 0.1)
add_subdirectory(flexbison)
add_executable(executable main.cpp)
target_include_directories(executable PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_BINARY_DIR}/flexbison"
)
set_target_properties(executable PROPERTIES CXX_STANDARD 11)
target_link_libraries(executable parserlib)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-
flexbison/CMakeLists.txt:
find_package(FLEX)
find_package(BISON)
flex_target(lexer lexer.ll "${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp")
bison_target(parser parser.yy ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.h)
add_flex_bison_dependency(lexer parser)
add_library(parserlib STATIC
${FLEX_lexer_OUTPUTS}
${BISON_parser_OUTPUTS}
)
-
main.cpp文件:
#include <parser.h> // <-this was the line causing troule
#include <iostream>
extern int yylex(void);
int main(int argc, char *argv[])
{
yyparse();
return 0;
}
现在,重点是:这样做是否正确?将main 函数放在bison 代码中会更好吗?
我的主要问题,如代码中突出显示的那样,是在 main.cpp 中包含 parser.h 头文件。 这是 CMake 的方式吗?
提前致谢!
【问题讨论】:
-
这是 CMake 的做法吗? 您的方法看起来基本正确。您可以在您的
add_library( ...之后添加一个target_include_directories(parserlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR}),以便在链接到 parserlib 目标时自动包含文件夹。
标签: c++ cmake include bison flex-lexer