C 在Linux上使用包装Qt segfaults仅举一个基本示例
我一直在尝试用C接口包装一些Qt类,以用于我最新的D项目。不管出于什么原因,这段代码在Windows上运行良好,但在Linux上运行失败,我一直无法找到它背后的原因。我还没有尝试在OSX上构建 我使用的是Qt5.3,运行的是LinuxMint 代码分布在几个不同的文件中,因此我认为如果我将所有相关代码放在一些粘贴箱中可能会更容易 这些都是非常薄的包装,所以即使你不看它们,也应该很容易理解我的测试程序C 在Linux上使用包装Qt segfaults仅举一个基本示例,c,qt,C,Qt,我一直在尝试用C接口包装一些Qt类,以用于我最新的D项目。不管出于什么原因,这段代码在Windows上运行良好,但在Linux上运行失败,我一直无法找到它背后的原因。我还没有尝试在OSX上构建 我使用的是Qt5.3,运行的是LinuxMint 代码分布在几个不同的文件中,因此我认为如果我将所有相关代码放在一些粘贴箱中可能会更容易 这些都是非常薄的包装,所以即使你不看它们,也应该很容易理解我的测试程序 #include <Application.h> #include <Ma
#include <Application.h>
#include <MainWindow.h>
int main( int argc, char* argv[])
{
Qt_Application* app = Qt_Application_create(argc, argv);
Qt_MainWindow* window = Qt_MainWindow_create();
Qt_MainWindow_show(window);//<- Segfault happens here
Qt_Application_exec(app);
Qt_Application_destroy(app);
Qt_MainWindow_destroy(window);
return 0;
}
在segfault点获取回溯显示:
#0 0x00007ffff789a92a in strlen () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6b6c6bc in QCoreApplication::arguments() ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Core.so.5
#2 0x00007ffff1470213 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#3 0x00007ffff14705f9 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#4 0x00007ffff147d127 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#5 0x00007ffff1470009 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#6 0x00007ffff5d47e03 in QWindow::create() ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Gui.so.5
#7 0x00007ffff716b97a in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#8 0x00007ffff714e6f5 in QWidget::create(unsigned long long, bool, bool) ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#9 0x00007ffff71512ea in QWidget::setVisible(bool) ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#10 0x00007ffff7bd8205 in Qt_MainWindow_show ()
from /home/jebbs/Documents/projects/HeliosCTest/libqtcl.so.1
#11 0x0000000000400922 in main (argc=1, argv=0x7fffffffe158) at main.cpp:22 <-actually points to Qt_MainWindow_show(window), but this is from a test with printf's in it
strlen()中的0 0x00007FF789A92A,来自/lib/x86_64-linux-gnu/libc.so.6
#QCoreApplication::arguments()中的1 0x00007FF6B6C6BC()
from/home/jebbs/Qt/5.3/gcc_64/lib/libQt5Core.so.5
#2 0x00007FF1470213英寸??()
from/home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#3 0x00007ffff14705f9英寸??()
from/home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#4 0x00007ffff147d127英寸??()
from/home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#5 0x00007ffff1470009英寸??()
from/home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#QWindow::create()中的6 0x00007ffff5d47e03()
from/home/jebbs/Qt/5.3/gcc_64/lib/libQt5Gui.so.5
#QWidgetPrivate::create_sys(unsigned long,bool,bool)()中的7 0x00007FF716B97A来自/home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#QWidget::create中的8 0x00007ffff714e6f5(无符号长、布尔、布尔)()
from/home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#QWidget::setVisible(bool)()中的9 0x00007FF71512EA
from/home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#Qt_主窗口中的10 0x00007FF7BD8205显示()
from/home/jebbs/Documents/projects/HeliosCTest/libqtcl.so.1
#在main.cpp:22处,main中的11 0x000000000040922(argc=1,argv=0x7fffffffe158)我认为用C包装Qt代码不是一个好主意。如果您更喜欢用C编写代码,请使用而不是Qt。Qt似乎有更好的支持,而且我正在寻找的许多功能都是内置的,所以我想使用它。为什么你认为这样包装不是一个好主意?然后用QT用C++代码!我想创建C接口,以便在d中使用它。然后您需要了解d的内存模型(IIRC,它是一种垃圾收集语言,使用Boehm的保守垃圾收集器实现)和Qt的内存模型。这需要一些工作。你应该在你的问题中告诉我你正在把Qt和D连接起来。
#0 0x00007ffff789a92a in strlen () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6b6c6bc in QCoreApplication::arguments() ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Core.so.5
#2 0x00007ffff1470213 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#3 0x00007ffff14705f9 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#4 0x00007ffff147d127 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#5 0x00007ffff1470009 in ?? ()
from /home/jebbs/Qt/5.3/gcc_64/plugins/platforms/libqxcb.so
#6 0x00007ffff5d47e03 in QWindow::create() ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Gui.so.5
#7 0x00007ffff716b97a in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#8 0x00007ffff714e6f5 in QWidget::create(unsigned long long, bool, bool) ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#9 0x00007ffff71512ea in QWidget::setVisible(bool) ()
from /home/jebbs/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5
#10 0x00007ffff7bd8205 in Qt_MainWindow_show ()
from /home/jebbs/Documents/projects/HeliosCTest/libqtcl.so.1
#11 0x0000000000400922 in main (argc=1, argv=0x7fffffffe158) at main.cpp:22 <-actually points to Qt_MainWindow_show(window), but this is from a test with printf's in it