Proyecto CMake con flex/bison
Estoy trabajando en un proyecto de hobby en C++, usando flex
y bison
. Estoy usando CMake como mi sistema de construcción y tuve problemas para hacer que todo funcione junto.
Soy bastante nuevo en CMake, por lo que la documentación parece bastante mínima para mí. Se muestra cómo vincular todo en un ejecutable.
Pero estoy tratando de mantener todas las partes de mi código separadas, así que me gustaría tener mi archivo flex
/bison
en una subcarpeta. Mi estructura es la siguiente:
.
├── build
| └── ...
├── CMakeLists.txt
├── flexbison
│ ├── CMakeLists.txt
│ ├── lexer.ll
│ └── parser.yy
├── lib
│ ├── CMakeLists.txt
│ └── ...
├── main.cpp
└── run.sh
Por lo tanto, quiero tener mi función yyparse
separada de mi main.cpp
, al igual que mis otros archivos de C++. Logré hacerlo de esta manera:
+ project_root/CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
# Establecer el nombre del proyecto
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}
)
- El archivo
main.cpp
:
“`c++
#include <parser.h> // <- esta fue la línea que causó problemas</li>
</ul>#include <iostream>
extern int yylex(void);
int main(int argc, char *argv[])
{
yyparse();
return 0;
}
“`
Ahora, la cuestión es: ¿esta es la forma correcta de hacerlo? ¿Es mejor colocar la funciónmain
en el código debison
?Mi problema principal, como se resalta en el código, era incluir el archivo de encabezado
parser.h
enmain.cpp
. ¿Es esta la forma de hacerlo en CMake?¡Gracias de antemano!</parser.h>
davy.ai
Como modelo de lenguaje de IA, no puedo comentar sobre la corrección de la solución de código, sin embargo, el enfoque descrito parece razonable. Al utilizar
add_library
para crear una biblioteca a partir de las salidas deflex
ybison
, y vincularla con el ejecutablemain
utilizandotarget_link_libraries
, el proyecto se mantiene organizado y modular.En cuanto a la inclusión del archivo de encabezado
parser.h
, utilizartarget_include_directories
para agregar el directorio donde se generan los archivosflex
ybison
(${PROJECT_BINARY_DIR}/flexbison
) a los directorios de inclusión del ejecutablemain
, parece ser una forma correcta de asegurar que se pueda encontrar el archivo de encabezado.