我正在用C++做一个业余项目,使用flex
和bison
。我使用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