在使用合并编译的C程序中,协助静态链接SQLite可加载扩展

在使用合并编译的C程序中,协助静态链接SQLite可加载扩展,c,sqlite,compilation,C,Sqlite,Compilation,我正试图用一个C程序编译SQLite,并至少使用一个可加载的非核心SQLite扩展(静态链接),这意味着将生成一个不依赖于其他文件的可执行文件 现在,我正在尝试加载carray.c。我有carray.c文件和carray.h文件。我已经阅读了SQLite的说明,特别是静态链接的第6项;但我真的不知道如何正确理解它 在说明书第6项中,你能告诉我以下情况吗 在它读到的地方,要静态链接扩展,只需添加-DSQLITE\u核心编译时选项这是否适用于编译sqlite3.c文件、carray.c文件,或者两者

我正试图用一个C程序编译SQLite,并至少使用一个可加载的非核心SQLite扩展(静态链接),这意味着将生成一个不依赖于其他文件的可执行文件

现在,我正在尝试加载
carray.c
。我有
carray.c
文件和
carray.h
文件。我已经阅读了SQLite的说明,特别是静态链接的第6项;但我真的不知道如何正确理解它

在说明书第6项中,你能告诉我以下情况吗

  • 在它读到的地方,
    要静态链接扩展,只需添加-DSQLITE\u核心编译时选项
    这是否适用于编译
    sqlite3.c
    文件、
    carray.c
    文件,或者两者都适用?如何做到这一点
  • 我应该说我用的是minGW-W64。我一直在用我的c文件编译
    sqlite3.c
    合并文件,首先使用,
    gcc-O2-csqlite3.c-DSQLITE\u ENABLE\u JSON1
    生成
    sqlite3.o
    文件,然后用我不断变化的代码编译成
    gcc-O2 sqlite3.o myfile.c-o myfile.exe
    。在尝试合并
    carray
    可加载扩展之前,这一直有效

    早些时候,我尝试将
    sqlite3.c
    carray.c
    分别编译为各自的
    .o
    文件,然后用
    myfile.c
    编译它们,编译时没有错误;但当我尝试使用carray时,它并没有被认为是一个函数。我认为问题在于初始化/入口点项目

  • 我想我理解关于
    SQLITE\u EXTENSION\u INIT
    的名称更改,我想我需要告诉我们
    sqlite3\u auto\u EXTENSION()
    ,因为我的C程序需要多个连接,不是连接到同一个数据库文件,而是连接到多个文件。然而,我在这一点上感到非常困惑。当阅读关于
    sqlite3\u auto\u extension()
    的文章时,我不知道什么是入口点,也不知道如何使用/提供
    xEntryPoint
    。数据库句柄似乎要传递到
    xEntryPoint
    中,这让我感到困惑,因为我认为这是为了自动将扩展加载到每个数据库连接中,而不仅仅是一个句柄
  • 它还读取
    然后修改您的应用程序以直接调用入口点,传入一个空指针作为第三个“pApi”参数。
    我想它在其他地方读到,这将在主C函数的开头附近完成,但我不知道如何做

  • carray.h
    文件是否包含在我的C程序中
  • 这一点,特别是在第(3)篇文章中,关于在合并文件中包含扩展源代码,是很有趣的,我想我几乎遵循了它;但我不明白它与常规指令相比如何,或者它是否是一种更好的方法

  • 如果可能的话,请您解释一下将SQLITE_扩展_INIT1单独放在一行上做了什么,或者使用-DSQLITE_CORE进行编译如何使其成为不可操作的
  • 多谢各位


    上面提到的SQLite论坛帖子很有用。我只是在
    sqlite3.c
    合并文件中添加了
    carray.c
    ,然后在它之后添加了
    core\u init()
    函数示例,更改了一个
    sqlite3\u auto\u扩展((void*)sqlite3\u autobusy init)
    使用
    sqlite3\u carray\u init
    ,并注释掉另一个,因为当前只有一个链接扩展,并在我的代码中包含
    carray.h
    。然后将合并编译为
    gcc-O2-csqlite3.c-DSQLITE\u ENABLE\u JSON1-DSQLITE\u EXTRA\u INIT=core\u INIT
    。您不需要JSON1的第一个,但我保留了它,以确保它们能够一起工作。我仍然想知道如何使用说明书中的方法进行同样的操作

    有关如何按照说明添加扩展名而不是附加到合并文件的说明,请参见此处

  • “静态链接”基本上是指将目标文件直接包含到生成的程序中。在这里,您不需要首先调用只编译的过程(-c)。您可以编译+链接:
    gcc-DSQLITE\u CORE sqlite3.c carray.c-o myfile.exe

  • 据我所知,
    sqlite3\u auto\u extension()
    是一个函数,允许您在初始化sqlite时为要自动加载的扩展指定入口点(read:init function,它将函数指针作为参数)。通常,您会在使用sqlite的应用程序(即驱动程序)中调用它。但是,当然,您也可以像目前一样将其添加到sqlite3.c的末尾,从而有效地使其成为“内置的”

  • 不可以。您应该在.c文件中包含头,预处理器include指令基本上是文件内容的复制粘贴

  • 宏位于此处:。在当前的形式中,宏并没有使它们成为“no ops”,因此我认为文档可能引用了早期版本。我的机器上安装了3.34,宏在那里被一个关于
    SQLITE\u CORE
    的#if-#else块包围,这使它成为一个禁止操作的块。我无法在这里发布它的内容,因为我无法为它找到正确的格式


  • 谢谢你回答我的问题。我错过了一个外部无效sqlite3\u carray\u init(无效);在我的代码中。SQLite论坛的这篇文章对此进行了解释。两次,因为我的愚蠢。好的,很高兴听到你解决了。我的回答没有特别提到卡雷,因为坦率地说,你的问题也没有。