У меня есть очень простой тест для включения 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 build XML документация, Я считаю, что вы должны заменить
<compilerflag value="-lsqlite3"/>
с
<flag value="-lsqlite3"/>
или же
<lib base="sqlite3"/>
Я не очень разбираюсь в использовании внешних библиотек CPP (так что это точно не отвечает на ваш вопрос), но я знаю, что реализация SQLLite встроена в Haxe (для cpp, hl, java, lua, macro, neko , php и python.) Вот некоторая сопутствующая документация:
Вот фрагмент (из этого полный пример суть.)
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.
}