- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在搞砸了一点(以及对生成的 Makefile 进行了一些编辑)之后,看起来正在发生的事情是 moc 没有正确处理 MainWindow.h
(包含在 main.cpp
和 MainWindow.cpp
除非它与包含它的源文件位于同一文件夹中。
Moc 在 MainWindow.cpp
上运行,不处理包含,因此看不到 Q_OBJECT 宏,因此继续生成一个空的输出文件。我不确定 moc 是否通常处理包含或是否只是扫描目录,但无论哪种方式,需要 mocing 但位于其他目录中的 header 都不会被处理!
问题似乎与 moc 产生的输出有关。在第一种情况下(编译的那个),hello-world_automoc.cpp
和 moc_MainWindow.cpp
被生成。 hello-world_automoc.cpp
看起来像
/* This file is autogenerated, do not edit*/
#include "moc_MainWindow.cpp"
在第二种情况下,生成的 hello-world_automoc.cpp
看起来像
/* This file is autogenerated, do not edit*/
enum some_compilers { need_more_than_nothing };
根本没有moc_MainWindow.cpp
。如果我从 cmake 手动调用 moc 而不是在损坏的情况下使用 automoc,我会得到 moc_MainWindow.cpp
但它是空的。
首先,不,我没有忘记 set(CMAKE_AUTOMOC ON)
.还要注意 MainWindow
的 destructor is declared and implemented .
当我的目录结构如下所示:
CMakeLists.txt|__ main.cpp|__ MainWindow.cpp|__ MainWindow.h|__ MainWindow.ui
compiling works just fine.
However, when it looks like:
helloworld/|__ CMakeLists.txt|__ src/| |__ CMakeLists.txt| |__ main.cpp| |__ MainWindow.cpp||__ inc/| |__ MainWindow.h||__ gui/ |__ MainWindow.ui
I get linking errors:
Linking CXX executable hello-world
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow()':
MainWindow.cpp:(.text+0x3b): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0x4d): undefined reference to `vtable for MainWindow'
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::~MainWindow()':
MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow'
collect2: error: ld returned 1 exit status
make[2]: *** [src/hello-world] Error 1
make[1]: *** [src/CMakeFiles/hello-world.dir/all] Error 2
我真的很想将我的源代码和标题放在适当的子目录中,但我不太确定如何解决这个问题。
这实际上是一个更大的项目中最简单的可识别错误案例,所以我真的不那么热衷于仅仅因为我正在向其中添加 Qt GUI 来展平项目目录。
最佳答案
如前所述,moc 未处理 MainWindow.h
在你的例子中。迫使这种情况发生的一种方法是调用qt_wrap_cpp()
。直接在它上面(而不是在 MainWindow.cpp
上),然后将生成的文件包含在对 add_executable()
的调用中.
您的顶级 CMakeLists.txt 可能如下所示:
cmake_minimum_required(VERSION 2.8.9)
#set(CMAKE_AUTOMOC ON)
set(CMAKE_PREFIX_PATH "/opt/Qt/5.1.1/gcc_64")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
project(hello-world)
find_package(Qt5Widgets REQUIRED)
set(HW_HEADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc)
set(HW_GUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gui)
include_directories(${HW_HEADER_DIR})
subdirs(src)
和你的 src 一级像:
qt5_wrap_cpp(hello-world_SRC ${HW_HEADER_DIR}/MainWindow.h)
qt5_wrap_ui(hello-world_UI ${HW_GUI_DIR}/MainWindow.ui)
add_executable(hello-world MainWindow.cpp main.cpp
${hello-world_UI} ${hello-world_SRC})
qt5_use_modules(hello-world Widgets)
附录:
qt5_wrap_cpp(hello-world_SRC ../inc/MainWindow.h)
更干净。 关于c++ - Qt 5 cmake 失败,未定义对 hello world 上的 vtable 的引用,其中 inc 和 src 作为子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19761767/
我的 CS2 讲师给出了一个 java 正则表达式,用于检查单词是否重复: \\b(\\w+)\\s+\\1\\b 如何修改它来检查某个单词是否重复两次,如“hello hello hello”或“h
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) 已关闭 3 年前。 #include #include Void main() { Printf
我一直在分配以下作业来解释 3 个语句中发生的事情,但我无法弄清楚。 cout << ("hello" + 1); // ello cout << (*"hello") + 1; // 10
如何确定用户是否使用 hello.js 登录? 使用 Google Sign-In SDK,我可以使用 gapi.auth2.init() 注册回调,当设置 SDK 并准备好回答诸如“你是登录了吗?”
执行String S1 = "hello";后,JVM将在SCP中创建一个String对象,该对象将在value字段中保存一个字符数组,如 s1.value = {'h', 'e', 'l', 'l'
我正在 build gomobile Hello示例应用程序,但遇到以下问题:在 Xcode (7.1) 中打开应用程序后尝试构建并运行该应用程序时,出现错误“找不到 hello/Hello.h”文件
#coding=utf-8 '''Tkinter module''' from Tkinter import * import time root=Tk() t=Text(root,fg='red')
在C/C++中,下面两行代码有什么区别: char *str1="hello"; char *str2={"hello"}; 最佳答案 根据 2011 C 标准,条款 6.7.9 初始化,第 11
我对在 android studio 中导入 import.hello.Hello 时出错有疑问,如下图所示。请给我解决方案如何解决这个错误 最佳答案 请参阅此处 @Arpit Patel answe
hello/ 忽略文件夹结构中任何位置名为“hello”的所有文件夹 hello/* 仅忽略顶级文件夹“hello”。 这是为什么?请指出http://git-scm.com/docs/gitigno
请解释以下程序中发生了什么。 我在程序的开头和结尾检查了 strerror(errno) 返回的地址,并确认它每次都返回相同的地址。然后一旦确定这一点,在第一种情况下我继续将相同的地址分配给 ptr,
在整个互联网上你都会看到这个命令 alias hello='echo Hello' 是的,我知道以上是一个蹩脚的例子,但它不是重点。如果我执行它,它就会起作用。但是当我重新启动计算机时,它丢失了。为什
我正在学习 C++ 指针,而 -> 运算符对我来说似乎很奇怪。代替ptr->hello(); 可以写成 (*ptr).hello(); 因为它似乎也可以工作,所以我认为前者只是更方便方式。 是这样还是
这个问题在这里已经有了答案: About the changing id of an immutable string (5 个回答) 关闭4年前。 为什么 "hello"is "hello" 在 P
我需要Prolog的源代码,它用于与Weka连接,并且能够在Windows环境下使用Weka算法进行预测。我尝试通过 Java 连接,但无法使用 Java 和 Prolog 进行连接和预测。 最佳答案
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Capitalize First Char of Each Word in a String Java 编写进行以下
当我在 ruby 控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。 "hello".length 和 "hello" .length ruby
我创建了一个Hello World应用,系统生成了下面大部分的Android语言。在没有 System.out 语句的情况下运行应用程序时,模拟器中不会显示“Hello”。然后,使用 Eclipse
是的,所以我正在制作一个沼泽标准 Hello world 以确保 android 正常工作。这是我第一次使用 android,所以我正在设置环境。我按照以下程序制作了程序:http://develop
我是一名优秀的程序员,十分优秀!