在iOS上使用LLVM进行编译时,Sqlite FTS不起作用

在iOS上使用LLVM进行编译时,Sqlite FTS不起作用,第1张

概述我已经开发了一段时间的企业iPad应用程序.由于应用程序开发大约在2年前开始,我需要从源代码编译自己的SQLite版本,因为默认情况下默认的SQLite库(sqlite3.dylib)没有启用FTS. 好吧,从那以后一切都运转良好.我一直在使用GCC作为项目编译器. 问题是,现在我正在尝试将整个项目转换为使用ARC.为此,我需要使用Apple的LLVM编译器. 而已.当我更改编译器(从GCC 4. 我已经开发了一段时间的企业iPad应用程序.由于应用程序开发大约在2年前开始,我需要从源代码编译自己的sqlite版本,因为默认情况下默认的sqlite库(sqlite3.dylib)没有启用FTS.

好吧,从那以后一切都运转良好.我一直在使用GCC作为项目编译器.

问题是,现在我正在尝试将整个项目转换为使用ARC.为此,我需要使用Apple的LLVM编译器.

而已.当我更改编译器(从GCC 4.2到LLVM 3.1或4.0,而不转换为ARC,而不更改任何其他内容)时,我的应用程序构建正常,一切运行正常,除了我的FTS查询,它根本不起作用最简单的.它们总是运行并返回没有结果(但是使用sqlITE_OK代码).

我被困在这里我已经在WWDC’12与一位Apple工程师谈过,但我们找不到任何解决方案.

我保证它不太可能是格式错误的查询或类似的东西,因为该应用程序与GCC正常工作.此外,我能够在sqlite的终端版本上运行查询(或使用其他应用程序,如Base)

我也使用旧版本的sqlite,但我已更新到最新版本(3.7.13).一切都保持不变.我也注意到,现在(我不知道从什么时候开始)mac附带的sqlite支持FTS(!!!),我能够删除自己的版本并使用Apple的版本.问题是,我有完全相同的行为.

我一直在寻找解决方案,但找不到一个.我发现了一些与armv6和编译器优化相关的错误(可以通过使用-mno-thumb标志来修复),但这不是我的情况.我还注意到,当我使用Clang分析我的自定义sqlite文件时,它指出了很多很多“潜在的错误”.

我有这种非怀疑的观点,我(仍然)不相信它是一个LLVM或sqlite错误.在解决它们之前,我更愿意检查所有可能的内容.也许我忘记配置某些东西或者需要在编译器中添加一些我不做的标记.

我感谢任何帮助.同样,该错误仅发生在使用LLVM编译的项目中(即使使用默认的sqlite).如果我在sqlite3的终端版本上运行相同的查询,一切都很顺利.

更新:

这段代码有效.它创建一个新数据库,一个使用fts的新虚拟表,插入几个项目然后执行选择.我稍后会尝试更复杂的查询,但是,就目前而言,似乎我的应用程序的问题可能是我的代码中的错误.

NSArray *dirPaths = dirPaths = NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES);Nsstring *docsDir = [dirPaths objectAtIndex:0];sqlite3 *database;// Build the path to the database fileNsstring *databasePath = [[Nsstring alloc] initWithString: [docsDir stringByAppendingPathComponent: @"test.db"]];NSfileManager *filemgr = [NSfileManager defaultManager];NSError *error = nil;[filemgr removeItemAtPath:databasePath error:&error];const char *dbpath = [databasePath UTF8String];if (sqlite3_open(dbpath,&database) == sqlITE_OK){    char *errMsg;    const char *sql_stmt = "CREATE VIRTUAL table IF NOT EXISTS pages USING fts3(Title,body);";    if (sqlite3_exec(database,sql_stmt,NulL,&errMsg) != sqlITE_OK)    {        NSLog(@"Failed to create table");    } else {        sql_stmt = "INSERT INTO pages(docID,Title,body) VALUES(53,'Home Page','sqlite is a software...');";        if (sqlite3_exec(database,&errMsg) != sqlITE_OK)        {            NSLog(@"Failed to insert");        }        sql_stmt = "INSERT INTO pages(Title,body) VALUES('Download','All sqlite source code...');";        if (sqlite3_exec(database,&errMsg) != sqlITE_OK)        {            NSLog(@"Failed to insert");        }    }    sqlite3_stmt *statement;    const char *query_stmt = "select * from pages where body match 'soft*';";    if (sqlite3_prepare_v2(database,query_stmt,-1,&statement,NulL) == sqlITE_OK)    {        if (sqlite3_step(statement) == sqlITE_ROW)        {            NSLog(@"%@ - %@",[[Nsstring alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement,0)],1)]);        } else {            NSLog(@"no results");        }        sqlite3_finalize(statement);    }    sqlite3_close(database);} else {    NSLog(@"Failed to open/create database");}
解决方法 毕竟,我发现了这个错误.这是在我的代码中.总之,那是我发现的:
如果我有类似的东西(我知道这很奇怪/错误):

int a = 0;a = a++;NSLog(@"%d",a);

如果使用gcc编译此代码,则记录的值将为1;如果使用llvm编译,则记录的值为0.

我不知道为什么,但这是另一个问题:)

总结

以上是内存溢出为你收集整理的在iOS上使用LLVM进行编译时,Sqlite FTS不起作用全部内容,希望文章能够帮你解决在iOS上使用LLVM进行编译时,Sqlite FTS不起作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1038270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存