首页 > 数据库 >SQLite3编译

SQLite3编译

时间:2022-11-06 20:34:44浏览次数:73  
标签:sqlite3 lemon int db argv 编译 源码 SQLite3

官方编译方式

SQLite3 源码提供了非常便捷的编译脚本,通过执行以下命令可以编译得到sqlite3.csqlite3.hsqlite3ext.hshell.c 以及一个可执行程序 sqlite3。所有的代码都被合并到了sqlite3.c 文件中,根据官网How To Compile SQLite 一文中提到,这样做的好处是编译器能够进行更进一步的优化,从而提升5%~10%的性能。

mkdir bld                ;#  Build will occur in a sibling directory
cd bld                   ;#  Change to the build directory
../sqlite/configure      ;#  Run the configure script
make                     ;#  Run the makefile.
make sqlite3.c           ;#  Build the "amalgamation" source file
make test                ;#  Run some tests (requires Tcl)

将所有源码合并得到一个文件的方式尽管带来了很多便利的地方,但在实际使用时却有一些问题。由于合并得到的文件太大,通过Clion打开后会提示:

The file size (8.56MB) exceeds the configured limit(2.56MB). Code insight features are not available.

并且对其编辑或者调试可以感受到IDE明显的卡顿。尽管这些是外部工具自身的问题,那么我们能不能将SQLite退回多文件的编译方式缓解由于工具性能不足带来的问题呢?

改造项目

基于 3.39.4 版本更改

  • 新建一个空项目
  • 将 sqlite3 源码底下 src 目录中所有文件拷贝到新建的项目中
  • 将 sqlite3 源码底下 tool 目录中的lemon.clempar.c拷贝过来
  • 执行gcc -o lemon lemon.c生成lemon程序
  • 运行./lemon parse.y生成parse.cparse.h文件
  • 在 sqlite3 源码执行./configuremake命令
  • 将编译得到的tscr底下的opencodes.copencodec.hsqlite.h拷贝过来
  • 删除 test* 等一系列测试文件,以及tclsqlite.c文件
  • 创建CMakeLists.txt如下
cmake_minimum_required(VERSION 3.21)  
project(SqliteBuild C)  
  
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -DSQLITE_CORE=1")  
  
include_directories(${CMAKE_CURRENT_SOURCE_DIR})  
file(GLOB sources "*.c")  
file(GLOB headers "*.h")  
list(REMOVE_ITEM sources ${CMAKE_CURRENT_SOURCE_DIR}/lempar.c)  
list(REMOVE_ITEM sources ${CMAKE_CURRENT_SOURCE_DIR}/lemon.c)  
  
add_executable(SqliteBuild ${sources} ${headers} SqliteMain.c)

SqliteMain.c 为自己调试添加的入口文件,可自行更换

#include <stdio.h>  
#include "sqlite3.h"  
  
/* print a record from table outputed by sql statement */  
static int callback(void* NotUsed, int argc, char** argv, char** azColName) {  
    int i;  
    for (i = 0; i < argc; i++) {  
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  
    }  
    printf("\n");  
    return 0;  
}  
  
int main(int argc, char** argv) {  
    sqlite3* db;  
    char* zErrMsg = 0;  
    int rc;  
  
    if (argc != 3) {  
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);  
        return(1);  
    }  
    rc = sqlite3_open(argv[1], &db);  /* open database */  
    if (rc) {  
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        return(1);  
    }  
    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);  /* execute SQL statement */  
    if (rc != SQLITE_OK) {  
        fprintf(stderr, "SQL error: %s\n", zErrMsg);  
        sqlite3_free(zErrMsg);  
    }  
    sqlite3_close(db);  /* close database */  
    return 0;  
}

完整源码地址:https://github.com/ZhaoxiZhang/SQLite-3.39.4

标签:sqlite3,lemon,int,db,argv,编译,源码,SQLite3
From: https://www.cnblogs.com/ZhaoxiCheung/p/16863812.html

相关文章

  • 最新版Jenkins(jdk11)-----JAVA项目使用低版本jdk编译的解决办法
    背景开源Devops工具Jenkins宣布:从6月28日发布的Jenkins2.357和即将发布的9月LTS版本开始,Jenkins最低需要Java11。所以,你懂得,很坑,项目只是jdk1.8解决......
  • CentOS7编译安装haproxy-2.6.6
    创建用户并安装依赖包#selinux会影响haproxy启动,会有'cannotbindUNIXsocket(Permissiondenied)'的报错,请关闭它除非你知道设置selinux规则sed-i'/SELINUX/s/enf......
  • C#动态编译2
    思路:通过C#的编译对象CSharpCodeProvider对一段C#代码进行编译C#代码包含命名空间、类、方法。以及需要引用的命名空间可以在编译前增加DLL引用,这样动态的C#代码就可以......
  • java 编译器
    1.javac介绍2. javac文件系统3. 词法分析4.语法分析之认识树节点5.语法分析之建立抽象语法树6.符号表的组织7. 填充符号表8. 插入式注解的实现9.语......
  • clang在编译时指定目标文件所需的最低macOS版本
    调研这个的原因,是因为有个同事在macOS12.2上打包好的程序,放在macOS10.15上运行时报错:DyldErrorMessage: Symbolnotfound:__ZNKSt3__115basic_stringbufIcNS_11ch......
  • chromium的下载和编译
    chromium的下载和编译(流程详解)u012983289 于2022-08-2317:08:54chromedevtoolschromec++ 准备工作:1、         2、安装VS2019,且请......
  • onps栈移植说明(2)——编译器及os适配层移植
    2.字节对齐及基础数据类型定义    协议栈源码(码云/github)port/include/port/datatype.h中根据目标系统架构(16位or32位)及所使用的编译器定义基础数据类型及字节......
  • 3A5000 英雄无敌3编译
    下载vcmi源代码1.0.0https://github.com/vcmi/vcmi/releases/tag/1.0.0解压到vcmi1.0.0下载两个依赖库1.fuzzylitehttps://github.com/fuzzylite/fuzzylite/tree/......
  • 英雄无敌3开源引擎vcmi的编译安装
      vcmi是什么?vcmi是经典的SLG英雄无敌3的开源游戏引擎。原来的英雄无敌3只能在Windows上玩,现在通过vcmi,我们也可以在Unix/Linux,苹果等其它系统上玩了。......
  • gcc的编译过程
    1.预处理,生成.i的文件。(input)2.将.i的文件转换成汇编语言,生成.s的文件3.生成机器语言文件,.o的文件4.连接目标代码,生成可执行文件.out ......