让CMake在Windows上找到flex

6

我正在尝试在一个项目中使用Flex,并且正在尝试使用CMake将Flex与我的项目链接起来。我在网上找到了一个FindFLEX.cmake,我正在使用它来实现这个目标。你可以在这里找到它。本来这应该是CMake的默认设置,但我认为它并不是。我的文件目录结构如下:

root
---src
   ---CMakeLists.txt
   ---cmake
      ---Modules
         ---FindFLEX.cmake
---build
---external
   ---flex - Where flex is installed
      ---bin
         ---flex.exe
      ---lib
         ---libfl.a

我的src/CMakeLists.txt如下所示。
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
message(${CMAKE_MODULE_PATH})
set( project_name "try_flex" )
message(${project_name})
project(${project_name})
find_package(FLEX)
FLEX_TARGET(Mylexer tokenize.lex ${CMAKE_CURRENT_BINARY_DIR}/tokenize.cpp)
add_executable(${project_name} ${FLEX_Mylexer_OUTPUTS})
target_link_libraries(${project_name} ${FLEX_LIBRARIES})

FLEX_TARGET应该由FindFLEX.cmake提供,当它发现Flex包时。在build/目录中运行以下命令未找到flex软件包

build> cmake ..\src

然后我添加了前缀,这部分起作用了。

build> cmake -DCMAKE_PREFIX_PATH=c:\root\external\flex\ ..\src

发现可执行文件 flex.exe,但没有找到库文件。以下是FindFLEX.cmake的相关部分:

FIND_PROGRAM(FLEX_EXECUTABLE flex DOC "path to the flex executable")
message("DEBUG:"${FLEX_EXECUTABLE})
MARK_AS_ADVANCED(FLEX_EXECUTABLE)

FIND_LIBRARY(FL_LIBRARY NAMES fl DOC "path to the fl library")
message("DEBUG:FL_LIBRARY"${FL_LIBRARY})
MARK_AS_ADVANCED(FL_LIBRARY)
SET(FLEX_LIBRARIES ${FL_LIBRARY})

在运行cmake时,我收到的消息是:
DEBUG:c:/root/external/flex/bin/flex.exe
DEBUG:FL_LIBRARYFL_LIBRARY-NOTFOUND
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 file s:FL_LIBRARY (ADVANCED)
linked by target "try_flex" in directory C:/root/src

-- Configuring incomplete, errors occurred!

有没有人能告诉我,为什么在添加前缀路径后,我可以找到flex二进制文件,但找不到库文件呢?谢谢。

谢谢。


这是关于Adobe/Apache UI框架Flex还是词法分析器Lexical Analyzer?还是另一个名为Flex的不同东西? - JeffryHouser
我不确定那是FindFLEX.cmake的相关部分...你能展示一下试图定位库的那一部分吗?它与定位可执行文件的那一部分有什么不同? - SethMMorton
@Reboog711: 这是词法分析器。 - Mahesh Ravishankar
@SethMMorton 这是相关的部分...它似乎使用了CMake FIND_LIBRARY例程。除此以外没有别的了。你可以在这里查看整个文件。 - Mahesh Ravishankar
@MaheshRavishankar 谢谢;我重新标记了这个问题,从用于Adobe/Apache框架的“Flex”改为用于词法分析器的“Flex-lexer”。 - JeffryHouser
NAMES 变量中有什么?如果 Flex 库的名称不在该变量中,则可能无法找到它。 - SethMMorton
1个回答

5
我找出了问题所在。在Windows上,cmake正在寻找libfl.lib。但是Flex的Windows安装仅提供libfl.a,因此我需要将以下两行添加到我的cmake。
LIST(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".a")
FIND_LIBRARY(FL_LIBRARY NAMES libfl fl DOC "path to the fl library")

第一行添加.a到被搜索库后缀列表中,第二行寻找libfl。这样做可以有效地搜索并找到所需的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接