C++ 打开ODBC db时Qt应用程序崩溃

C++ 打开ODBC db时Qt应用程序崩溃,c++,sql,qt,odbc,C++,Sql,Qt,Odbc,我正在开发一个与外部ODBC数据库连接的应用程序。 当我在Qt上运行它时,一切正常,但当我试图独立打开它时,它总是在m_db->open()上崩溃 应用程序崩溃时会出现以下错误: Segmentation fault (core dumped) 代码如下: m_db = new QSqlDatabase(QSqlDatabase::addDatabase("QODBC","edb")); m_db->setDatabaseName(m_line); m_db->open(); //

我正在开发一个与外部ODBC数据库连接的应用程序。 当我在Qt上运行它时,一切正常,但当我试图独立打开它时,它总是在m_db->open()上崩溃

应用程序崩溃时会出现以下错误:

Segmentation fault (core dumped)
代码如下:

m_db = new QSqlDatabase(QSqlDatabase::addDatabase("QODBC","edb"));
m_db->setDatabaseName(m_line);
m_db->open(); // <-// app crash here!
有人有线索吗

我正在运行Ubuntu 14.04 64位。 谢谢

编辑

好的,经过更多的测试后,如果我从m_line变量中删除驱动程序配置,它似乎停止崩溃,但是很明显,它停止工作了

EDIT2

在从Qt creator配置自定义运行后,它表示断点是反汇编程序上的0x7ffff6a777b9。这是什么意思?

这不是使用
QSqlDatabase
的方式
QSqlDatabase
实例是可通过连接名称检索的内部连接的句柄,它们不控制连接的生存期。 因此,应在以下文件上声明:


这是有史以来最愚蠢的陷阱。。。
我忘了在执行时添加LD_LIBRARY_PATH。

因为
m_db
是指针,它的值是多少?它是否指向有效的实例?为什么是指针?为什么不使用对象实例(不是指针)编写一个简单的测试应用程序,以验证该简单应用程序是否工作?是的,它是一个有效的指针。我添加了一段代码。谢谢你的评论。不幸的是,在应用建议的更改后,程序仍然在同一点崩溃。此外,由于内部管理的原因,我需要一个指针。我认为问题应该是,当Qt运行应用程序时,它会添加一些我没有的配置参数(比如添加一些include path)。根据我上次的更新,问题是anywhere库在Qt外部启动时崩溃。@Atron调试器说什么?事实上,什么都没有。当程序在Qt Creator上启动时(即使在发布模式下),它也可以工作。当我试图在终端上启动它或单击可执行文件时,问题就会出现。再次感谢@cmannett85@Atron“由于内部管理,我需要一个指针”不,你不需要
m_db
不应是指针,应使用
QSqlDatabase::addDatabase(..)
初始化它,并使用`QSqlDatabase::removeDatabase(..)销毁它,两者都使用“edb”作为连接标识符。因此,您真正的问题似乎是ODBC驱动程序不在Qt Creator之外的应用程序可以找到它的位置。如果ODBC db不可用,gui将冻结3-4秒,因为程序尝试重新连接数据库,为了避免这种情况,我将db指针发送到另一个线程,并尝试在其上打开db。当db被打开时,一个信号被发送到主线程,额外的线程被关闭。我不想提及这一点,因为问题不在于线程,而在于qsl驱动程序在Qt外部打开的方式,以免让人们感到困惑。现在我只有open创建一个QSqlDatabase实例并尝试打开数据库。如果我不使用指针,问题就不会解决(
m_line = "Driver=/opt/sqlanywhere12/lib64/libdbodbc12.so;CommLinks=tcpip(Host=ip;port=port);ServerName=db;DatabaseName=db;Uid=uid;Pwd=psswd;"
m_db = QSqlDatabase::addDatabase("QODBC","edb"));
m_db.setDatabaseName(m_line);     
m_db.open();