在使用合并编译的C程序中,协助静态链接SQLite可加载扩展
我正试图用一个C程序编译SQLite,并至少使用一个可加载的非核心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文件,或者两者
carray.c
。我有carray.c
文件和carray.h
文件。我已经阅读了SQLite的说明,特别是静态链接的第6项;但我真的不知道如何正确理解它
在说明书第6项中,你能告诉我以下情况吗
要静态链接扩展,只需添加-DSQLITE\u核心编译时选项
这是否适用于编译sqlite3.c
文件、carray.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程序中上面提到的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的第一个,但我保留了它,以确保它们能够一起工作。我仍然想知道如何使用说明书中的方法进行同样的操作
有关如何按照说明添加扩展名而不是附加到合并文件的说明,请参见此处
gcc-DSQLITE\u CORE sqlite3.c carray.c-o myfile.exe
sqlite3\u auto\u extension()
是一个函数,允许您在初始化sqlite时为要自动加载的扩展指定入口点(read:init function,它将函数指针作为参数)。通常,您会在使用sqlite的应用程序(即驱动程序)中调用它。但是,当然,您也可以像目前一样将其添加到sqlite3.c的末尾,从而有效地使其成为“内置的”
SQLITE\u CORE
的#if-#else块包围,这使它成为一个禁止操作的块。我无法在这里发布它的内容,因为我无法为它找到正确的格式
谢谢你回答我的问题。我错过了一个外部无效sqlite3\u carray\u init(无效);在我的代码中。SQLite论坛的这篇文章对此进行了解释。两次,因为我的愚蠢。好的,很高兴听到你解决了。我的回答没有特别提到卡雷,因为坦率地说,你的问题也没有。