使用cmake链接错误编译flex和bison

问题描述

我使用 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 (将#修改为@)