CMake project with flex/bison



我正在用C++做一个业余项目,使用flexbison。我使用CMake作为我的构建系统,我很难让所有的系统协同工作。

我是CMake的新手,所以文档对我来说似乎很简单。它展示了如何将所有内容链接到一个可执行文件中。但我试图将代码的所有部分分开,所以我希望将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的方法吗

提前感谢!

如果我是你,我会有:

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}>)
...

由于CCD_ 17是"0";target_link";对于提供公共include目录的parserlib,您不需要再在executable的include目录中列出这些目录。

参考:https://cmake.org/cmake/help/latest/command/target_include_directories.html

最新更新