【问题标题】:CMake project with flex/bison带有 flex/bison 的 CMake 项目
【发布时间】:2022-01-04 16:36:49
【问题描述】:

我正在使用 flexbison 使用 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


【解决方案1】:

如果我是你,我会:

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
)

注意:$&lt;INSTALL_INTERFACE:include/parserlib&gt; 需要根据需要进行调整以及如何安装 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

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多