gpt4 book ai didi

c++ - CMake FindFLEX 在 Windows 上生成 NOTFOUND

转载 作者:行者123 更新时间:2023-12-05 05:36:31 29 4
gpt4 key购买 nike

我用chocolatey安装了flex和bison

choco install winflexbison3

并创建了这个 CMakeLists.txt

find_package(BISON)
find_package(FLEX)
message("FLEX_FOUND: ${FLEX_FOUND}")
message("FLEX_EXECUTABLE: ${FLEX_EXECUTABLE}")
message("FLEX_INCLUDE_DIRS: ${FLEX_INCLUDE_DIRS}")
message("FLEX_LIBRARIES: ${FLEX_LIBRARIES}")

BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp)
FLEX_TARGET(MyScanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp)
ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(Foo
${BISON_MyParser_OUTPUTS}
${FLEX_MyScanner_OUTPUTS}
)
target_link_libraries(Foo ${FLEX_LIBRARIES})

我写了一个虚拟解析器(从 https://aquamentus.com/flex_bison.html 复制)并尝试构建项目

-- Found BISON: C:/ProgramData/chocolatey/bin/win_bison.exe (found version "3.7.4")
-- Found FLEX: C:/ProgramData/chocolatey/bin/win_flex.exe (found version "2.6.4")
FLEX_FOUND: TRUE
FLEX_EXECUTABLE: C:/ProgramData/chocolatey/bin/win_flex.exe
FLEX_INCLUDE_DIRS: FLEX_INCLUDE_DIR-NOTFOUND
FLEX_LIBRARIES: FL_LIBRARY-NOTFOUND
CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as

cmake_minimum_required(VERSION 3.23)

should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run "cmake --help-policy CMP0000".
This warning is for project developers. Use -Wno-dev to suppress it.

-- Configuring done
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
FL_LIBRARY (ADVANCED)
linked by target "Foo" in directory C:/Users/Aleksander/source/repos/C/insilico/blender/test

-- Generating done
CMake Generate step failed. Build files cannot be regenerated correctly.

出于某种原因,CMake 无法找到库并包含目录。我应该怎么办? FLEX 希望图书馆在哪里?

这是我到目前为止所做的:

我看到 FlexLexer.h 就在那里

C:\ProgramData\chocolatey\lib\winflexbison3\tools> ls
FlexLexer.h changelog.md custom_build_rules win_bison.exe
UNISTD_ERROR.readme chocolateyInstall.ps1 data win_flex.exe

我看到 FindFLEX 使用此源代码来查找此文件,但不知何故失败了 https://github.com/Kitware/CMake/blob/241fc839d56ccd666fe41269e291b8d8190cf97b/Modules/FindFLEX.cmake#L117


find_library(FL_LIBRARY NAMES fl
DOC "Path to the fl library")

find_path(FLEX_INCLUDE_DIR FlexLexer.h
DOC "Path to the flex headers")

mark_as_advanced(FL_LIBRARY FLEX_INCLUDE_DIR)

set(FLEX_INCLUDE_DIRS ${FLEX_INCLUDE_DIR})
set(FLEX_LIBRARIES ${FL_LIBRARY})

我找到了 find_path 的文档 http://devdoc.net/linux/cmake-3.9.6/command/find_path.html并且有一个搜索路径列表。我用

查询了他们
message("CMAKE_INCLUDE_PATH: ${CMAKE_INCLUDE_PATH}")
message("CMAKE_FRAMEWORK_PATH: ${CMAKE_FRAMEWORK_PATH}")
message("CMAKE_SYSTEM_INCLUDE_PATH: ${CMAKE_SYSTEM_INCLUDE_PATH}")
message("CMAKE_SYSTEM_FRAMEWORK_PATH: ${CMAKE_SYSTEM_FRAMEWORK_PATH}")
message("CMAKE_LIBRARY_ARCHITECTURE: ${CMAKE_LIBRARY_ARCHITECTURE}")
message("CMAKE_FIND_ROOT_PATH: ${CMAKE_FIND_ROOT_PATH}")
message("CMAKE_SYSROOT: ${CMAKE_SYSROOT}")

得到了

CMAKE_INCLUDE_PATH:
CMAKE_FRAMEWORK_PATH:
CMAKE_SYSTEM_INCLUDE_PATH:
CMAKE_SYSTEM_FRAMEWORK_PATH:
CMAKE_LIBRARY_ARCHITECTURE:
CMAKE_FIND_ROOT_PATH:
CMAKE_SYSROOT:

所以看起来 find_path 什么也没做。我应该自己指定路径吗?但是这种情况下 CMake 到底是为了什么?

最佳答案

令人震惊的是,有多少恼人的问题是由一个可能根本不应该存在并且几乎从来不需要的库文件引起的。

有问题的库最初称为 libl(l 用于 lex),Posix 要求在链接包含 lex 生成的扫描程序的可执行文件时,添加 -ll 链接器调用。 Flex,就所有意图和目的而言,是 Lex 工具的当前继承者,决定将库的名称更改为 libfl,这通常是您在 Flex 安装中找到的名称。因此,最近(即过去几十年)您会发现的常用说明说您应该使用命令行选项 -lfl

通常但并非总是如此,发行版会为 libl 添加一个符号链接(symbolic link)(或等效链接),以便 Posix 指定的 -ll 仍然有效。有时,Flex 发行版会被修改为库名为 libl,在这种情况下 -lfl 将不起作用。有时,库根本不是发行版的一部分,需要从不同的包中获取。

Posix 想要迎合 Lex 实现,它将一些函数放入库中,而不是每次都生成相同的代码。但是很少(如果有的话)lex 实现利用了该规定;特别是,Flex 生成的扫描器不依赖于 libfl 的任何内部功能。该库中只定义了两个函数:

int main(void) { while (yylex()) {} }

int yywrap(void) { return 1; }

第一个是 main 的默认实现,它只调用 yylex 直到它返回 0(表示 EOF)。这对于快速扫描器规则测试可能很方便,但任何实际项目肯定会有一个 main() 定义。

第二个提供默认的 yywrap 实现。但是,Flex 提供了一种更简单的方法来指示不需要 yywrap 功能:

%option noyywrap

如果您不需要yywrap,您应该将上面的内容添加到您的.l 文件中(在序言中)。如果您确实需要 yywrap,那么您需要定义它。无论哪种情况,您都不需要图书馆。

所以我的建议是,与其浪费时间去找出你正在使用的 flex 包装的缺陷,不如将上面的 %option 添加到你的 Flex 输入文件中,并从中删除库你的构建规则。

关于c++ - CMake FindFLEX 在 Windows 上生成 NOTFOUND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73292017/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com