问题描述
我使用 bison 和 flex 构建了一个编译器。我也使用 CMake 来帮助我构建文件。
问题是它无法链接文件,但是当我手动构建它们时,效果很好!
(在代码中,我还构建了其他库,但我认为它们不是问题)
错误信息是:
[2/2 100% :: 0.163] Linking CXX executable src/main.out
[build] Failed: src/main.out
[build] : && /bin/g++ -g src/CMakeFiles/main.out.dir/Syntax.tab.cpp.o src/CMakeFiles/main.out.dir/lex.yy.c.o -o src/main.out src/Exceptions/libexceptions_lib.a "src/Symbol Table/Types/libtypes_lib.a" "src/Symbol Table/libsymbol_table_lib.a" "src/Global Buffer/libglobal_buffer_lib.a" "src/Symbol Table/Types/libtypes_lib.a" src/Exceptions/libexceptions_lib.a && :
[build] /usr/bin/ld: src/CMakeFiles/main.out.dir/Syntax.tab.cpp.o: in function `yyparse()':
[build] {path to my project}/build/Syntax.tab.cpp:1208: undefined reference to `yylex()'
我的项目框架:
{main directory}:
./CMakeLists.txt
./src:
./Exceptions
./Global Buffer
./Symbol Table:
./Types
./lex.yy.c
./Syntax.tab.cpp
./Syntax.tab.hpp
./CMakeLists.txt
./build
主目录下的CMake文件只包含源目录下的那个。
源目录下的 CMake 文件如下所示:
# Add the exceptions files.
add_subdirectory("./Exceptions")
# Add the symbol table files.
add_subdirectory("./Symbol Table")
# Add the global buffer.
add_subdirectory("./Global Buffer")
add_executable("main.out"
"./Syntax.tab.cpp"
"./lex.yy.c"
"./Syntax.tab.hpp"
)
# Include the libraries.
target_link_libraries("main.out" PUBLIC exceptions_lib)
target_link_libraries("main.out" PUBLIC types_lib)
target_link_libraries("main.out" PUBLIC symbol_table_lib)
target_link_libraries("main.out" PUBLIC global_buffer_lib)
Exceptions 文件夹中的 CMakeLists.txt:
file(GLOB exceptions_code_files "./*.cpp")
file(GLOB exceptions_header_files "./*.hpp")
add_library(
exceptions_lib
${exceptions_code_files}
${exceptions_code_files}
)
全局缓冲区文件夹中的 CMakeLists.txt:
file(GLOB global_buffer_code_files "./*.cpp")
file(GLOB global_buffer_header_files "./*.hpp")
add_library(
global_buffer_lib
${global_buffer_code_files}
${global_buffer_header_files}
)
符号表文件夹中的CMakeLists.txt:
#Add the types files.
add_subdirectory("./Types")
file(GLOB symbol_table_code_files "./*.cpp")
file(GLOB symbol_table_header_files "./*.hpp")
add_library(
symbol_table_lib
${symbol_table_code_files}
${symbol_table_header_files}
)
target_link_libraries(symbol_table_lib PUBLIC types_lib)
target_link_libraries(symbol_table_lib PUBLIC exceptions_lib)
符号表/类型文件夹中的 CMakeLists.txt 文件:
file(GLOB types_code_files "./*.cpp")
file(GLOB types_header_files "./*.hpp")
add_library(
types_lib
${types_code_files}
${types_header_files}
)
target_link_libraries(types_lib PUBLIC exceptions_lib)
这就是所有的 CMake 代码。
手动构建文件如下所示:
#!/bin/sh
SORUCE_FILES_PATH="./src/"
SYMBOL_TABLE_SOURCE_PATH="${SORUCE_FILES_PATH}Symbol Table/"
TYPES_SOURCE_PATH="${SYMBOL_TABLE_SOURCE_PATH}Types/"
GLOBAL_BUFFER_PATH="${SORUCE_FILES_PATH}Global Buffer/"
EXCEPTIONS_PATH="${SORUCE_FILES_PATH}Exceptions/"
g++ -o "./build/main.out" \
"${SORUCE_FILES_PATH}Syntax.tab.hpp" \
"${SORUCE_FILES_PATH}Syntax.tab.cpp" \
"${SORUCE_FILES_PATH}lex.yy.c" \
"${SYMBOL_TABLE_SOURCE_PATH}symbol_table.cpp" \
"${SYMBOL_TABLE_SOURCE_PATH}variable.cpp" \
"${TYPES_SOURCE_PATH}array_properties.cpp" \
"${TYPES_SOURCE_PATH}function_type_properties.cpp" \
"${TYPES_SOURCE_PATH}numberic_type_properties.cpp" \
"${TYPES_SOURCE_PATH}type_properties.cpp" \
"${GLOBAL_BUFFER_PATH}global_buffer.cpp" \
"${EXCEPTIONS_PATH}no_frames_exception.cpp" \
"${EXCEPTIONS_PATH}invalid_variable_type_exception.cpp" \
"${EXCEPTIONS_PATH}item_already_exsists_exception.cpp" \
"${EXCEPTIONS_PATH}item_not_found_exception.cpp" \
手动构建效果很好,cmake 构建失败!
任何帮助将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)