[英]CMake project with flex/bison
我正在使用flex
和bison
在 C++ 中从事一个爱好项目。 我正在使用 CMake 作为我的构建系统,我很难让所有的工作一起工作。
我对 CMake 很陌生,所以文档对我来说似乎很少。 它展示了如何将所有内容链接到一个可执行文件中。 但我试图将代码的所有部分分开,所以我想将我的flex
/ bison
文件放在一个子文件夹中。 我的结构是这样的:
.
├── build
| └-- ...
├── CMakeLists.txt
├── flexbison
│ ├── CMakeLists.txt
│ ├── lexer.ll
│ └── parser.yy
├── lib
│ ├── CMakeLists.txt
│ └── ...
├── main.cpp
└── run.sh
所以我想让我的yyparse
function 与我的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
的function放在bison
代码中会更好吗?
正如代码中突出显示的那样,我的主要问题是在main.cpp
中包含parser.h
header 文件。 这是 CMake 的方式吗?
提前致谢!
如果我是你,我会:
flexbison/CMakeLists.txt
:
...
add_library(parserlib STATIC
${FLEX_lexer_OUTPUTS}
${BISON_parser_OUTPUTS}
)
target_include_directories(parserlib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include/parserlib> # <prefix>/include/parserlib
)
注意: $<INSTALL_INTERFACE:include/parserlib>
需要根据需要进行调整以及如何安装 parserlib...
project_root/CMakeLists.txt
:
...
target_include_directories(executable PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
...
由于executable
是针对提供公共包含目录的parserlib
的“target_link”,因此您不再需要在executable
的包含目录中列出这些目录。
参考: https://cmake.org/cmake/help/latest/command/target_include_directories.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.