CMake:"AUTOMOC"功能跳过可执行目标的来源?
CMake: 'AUTOMOC' feature skips sources of executable targets?
有一个中等规模的项目,其顶级CMakeLists.txt
定义了一些常见的东西,并调用了项目中所有工件(子项目)的配置,如下所示:
add_subdirectory(components/A)
add_subdirectory(components/B)
add_subdirectory(components/C)
add_subdirectory(components/E)
工件是静态/共享库或可执行文件(它们以某种方式相互依赖)。在本例中,只有一个可执行文件:E
。当使用普通的旧qt4_wrap_cpp
来处理MOC时,一切配置和构建都很好。
切换到(相对)新的AUTOMOC特性时,通过在顶部CMakeLists.txt
添加以下内容:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
所有静态/共享库的源代码都是AUTOMOC
'ed的。但是,可执行目标(本例中为E
)的源永远不会是AUTOMOC
'ed。
我尝试了MSYS Makefiles
和Ninja
生成器,两者都不为AUTOMOC
'ing创建目标,而仅为可执行文件的源(对于静态/共享库目标AUTOMOC
'ing目标添加)。
- 有人已经经历过了吗?
- 可能是什么原因? 这闻起来像臭虫吗?
我找到原因了,讨论在CMake邮件列表
总之,问题是E
没有明确地包括Qt模块:
find_package(Qt4 ...)
和隐式:
find_package(MyPrecious ...)
其中MyPrecious
可能是一些第三方模块,其中包含Qt本身。
因此,像QT_VERSION_*
这样的非缓存变量不存在于E
子项目的范围内,因此AUTOMOC
特性不能正常工作。我得说,这是一个令人讨厌的陷阱。
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- CMake:防止在子目录库项目中生成测试可执行目标
- Codelite 问题 - 未指定可执行文件,使用"目标可执行文件"
- 将 Icon 添加到可执行文件 (Eclipse CDT Luna) 时出现问题:make: *** 没有规则来制作目标 'resources.o'
- 为什么在构建依赖库之前没有开始编译目标可执行文件?
- 源代码构建中的 SCons 仅适用于可执行程序,不适用于目标文件
- 具有多个目标的生成文件,并创建一个包含可执行文件的目录
- CMake:"AUTOMOC"功能跳过可执行目标的来源?
- 试图在目标设备上运行一个交叉编译的可执行文件失败,出现以下错误: