Как заставить CMake найти flex в Windows

Я пытаюсь использовать 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, но не библиотеку после включения пути префикса? Любая помощь будет оценена по достоинству.

Спасибо


person Mahesh Ravishankar    schedule 22.05.2013    source источник
comment
Это про Adobe/Apache UI Framework Flex? ИЛИ Лексический анализатор? Или что-то другое под названием Flex?   -  person JeffryHouser    schedule 22.05.2013
comment
Я не уверен, что это соответствующая часть FindFLEX.cmake... можете ли вы показать часть, которая пытается найти библиотеку? Чем он отличается от той части, которая определяет местонахождение исполняемого файла?   -  person SethMMorton    schedule 22.05.2013
comment
@ Reboog711: это лексический анализатор   -  person Mahesh Ravishankar    schedule 22.05.2013
comment
@SethMMorton Это важная часть ... кажется, используются процедуры CMake FIND_LIBRARY. Ничего другого там нет. Вы можете проверить весь файл здесь   -  person Mahesh Ravishankar    schedule 22.05.2013
comment
@MaheshRavishankar Спасибо; Я изменил вопрос с Flex, который используется для платформы Adobe/Apache, на Flex-lexer, который используется для лексического анализатора.   -  person JeffryHouser    schedule 22.05.2013
comment
Что находится в переменной NAMES? Если имя flex-библиотеки отсутствует в этой переменной, она, вероятно, не сможет ее найти.   -  person SethMMorton    schedule 23.05.2013


Ответы (1)


Я понял, в чем проблема. В 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. Это сработало

person Mahesh Ravishankar    schedule 30.05.2013