如何在我的Haxe / hxcpp构建中包含libsqlite3

How to include libsqlite3 in my Haxe/hxcpp build?

本文关键字:构建 包含 libsqlite3 hxcpp 我的 Haxe      更新时间:2023-10-16

我有一个非常简单的测试,将SQLite3包含在我的Haxe构建中(我知道它内置了SQLite,但这个问题不仅适用于这里)。它看起来像这样:

@:include("sqlite3.h")
@:buildXml('<files id="haxe" append="true"><compilerflag value="-lsqlite3"/></files>')
extern class SQLite3 {
    @:native("sqlite3_open") public static function sqlite3_open(path: String, outReference:Reference<DBPointer>):Int;
}
@:include("sqlite3.h")
@:native("sqlite3")
extern class DBPointer {
}

这不会引发任何Haxe错误,但是当我尝试编译时,我在编译C++收到以下错误:

Undefined symbols for architecture x86_64:
"_sqlite3_open", referenced from:
    Main_obj::main() in aea44ed0_Main.o
ld: symbol(s) not found for architecture x86_64

我认为添加您可以看到的buildXml指令足以动态引用macOS SQLite库,但事实似乎并非如此。

我怎样才能在这里包含SQLite?

根据 hxcpp 构建 XML 文档,我认为您应该替换

<compilerflag value="-lsqlite3"/>

<flag value="-lsqlite3"/>

<lib base="sqlite3"/>

我对使用 CPP 外部库了解不多(所以这并不能完全回答你的问题),但我知道 SQLLite 实现内置于 Haxe 中(适用于 cpp、hl、java、lua、宏、neko、php 和 python 平台)。以下是一些相关文档:

  • https://api.haxe.org/sys/db/Sqlite.html
  • https://api.haxe.org/sys/db/Connection.html
  • https://api.haxe.org/sys/db/ResultSet.html

这是一个片段(来自这个完整的示例要点。

var conn = sys.db.Sqlite.open("test.db");
var rs = conn.request('
  CREATE TABLE IF NOT EXISTS artists_backup
  (
    artistid INTEGER PRIMARY KEY AUTOINCREMENT,
    name NVARCHAR
  );
');
var rs = conn.request('INSERT INTO artists_backup (name) VALUES ("John");');

请注意,ResultSet是一个Iterator<Dynamic>,但您可以添加类型提示以保持数据库代码美观且类型安全:

typedef RecordType = { name:String, id:Int };
for (record in (rs:Iterator<RecordType>)) {
  // While record is still a Dynamic object, the TypeDef alias tells
  // the compiler that .name and .id are the only valid fields.
}