【发布时间】:2015-09-03 10:12:37
【问题描述】:
我在 C++ 项目中使用带有 Flex 的 CMake 时遇到了一些问题。
我使用 FindFlex 及其宏 FLEX_TARGET 生成一个自定义命令,该命令简单地调用 Flex 可执行文件以从 .l 文件创建源文件。
See macro definition from Github Cmake project.
我的项目只包含在CMakeLists.txt 和我的Example.l LEX 文件中。还有一对文件,Parser.hpp/Parser.cpp,目前只包含一个“我什么都不做”的类(构造函数,析构函数,仅此而已):
这是CMakeLists.txt:
cmake_minimum_required(版本 3.0)
project(PARSER)
find_package(FLEX REQUIRED)
flex_target(Scanner Example.l ${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp)
set(Parse_SRCS
Parse.cpp
${FLEX_Scanner_OUTPUTS}
)
set(Parse_INCS
Parse.hpp
)
add_executable(Parse ${Parse_INCS} ${Parse_SRCS})
target_include_directories(Parse PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_include_directories(Parse PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")
问题:Scanner 目标永远不会被调用。
第一次检查:
- 当我输出
FLEX_FOUND、FLEX_EXECUTABLE和FLEX_LIBRARIES时,我看到模块已正确找到。 - 我已经在 Linux 和 Windows 安装的 CMake 和 Flex 上进行了测试。但这里和那里都一样。
- 内部自定义命令至少应输出类似“[FLEX][Scanner] Buildingscanner with flex 2.5.4”的消息,证明自定义命令已执行,但未执行。我仍然没有错误。
谢谢!
【问题讨论】:
-
自定义命令不会被调用,如果它的输出文件(
${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp)已经存在,并且新的输入(Example.l)。检查您是否还没有输出文件。此外,您可以检查Parse_SRCS变量的内容是否正确(只需使用message()打印即可)。 -
检查
Parse_SRCS值对应于${CMAKE_CURRENT_BINARY_DIR}/LexParser.cpp,这很好。是的,我已经检查过了,但没有输出文件阻止依赖项。