CMake:Flex custom_command从未调用过
CMake : Flex custom_command never called
我在C++项目中使用带有Flex的CMake时遇到了一些问题。我使用FindFlex
和它的宏FLEX_TARGET
,后者生成一个自定义命令,该命令简单地调用Flex可执行文件,从.l
文件创建一个源文件。
请参阅Github Cmake项目中的宏定义。
我的项目只包含在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]Building Scanner with FLEX 2.5.4",以证明自定义命令已执行,但未执行。不过我也没有错
谢谢!
函数flex_target
创建了一个自定义命令,而不是一个自定义目标。
自定义命令(与自定义目标不同(不是自己执行的,而是必须与消耗其输出的目标(或另一个自定义命令(关联。
您可以通过将flex_target
的输出(由函数写入FLEX_Scanner_OUTPUTS
变量(作为源文件添加到Parse
可执行文件中来完成此操作。这将导致在生成该可执行文件时生成该文件。
但是请注意,自定义命令总是在编译时执行(例如,运行make
时(,而不是在运行CMake时执行。
相关文章:
- 什么时候调用组成单元对象的析构函数
- netcat command in c++
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 系统( "command" ) 产生错误;但它在直接从 Bash 提示符调用时有效
- 当我在 c++ 中使用 system( "command" ) 时,我可以调用 cygwin 而不是普通命令行吗?
- 如何修复调用 Process32First() 时"The program issued a command but the command length is incorrect."错误?