私はpostgresql用のdartにネイティブ拡張を構築しようとしています。 CCファイルを.oでコンパイルした後、.so(共有オブジェクトと思います)でコンパイルしました。 libpsql.soという名前になり、私の.dartファイルと同じディレクトリに配置されました。ダーツファイルの最初の行は#import(dart-ext:libpsql)です。リソースは利用できないと私に伝え続けます。ネイティブ拡張Dart
マイダーツコード
#library("psql");
#import("dart-ext:libpsql_dart");
class Database {
var mDb;
var mUser;
var mDbname;
var mPasswd;
var mHost;
var mPort;
var mTable;
//String toString() => "<PostgreSQL: [email protected]$_host:$_port/$_table>";
Database(host,user,passwd,dbname) : this.mUser = user, this.mHost = host, this.mPasswd = passwd, this.mDbname = dbname {
mDb = _connect(host,user,passwd,dbname);
}
}
_connect(host,user,passwd,dbname) native 'Connect';
そして、ここでは私のC++コードです。
void Connect(Dart_NativeArguments args) {
Dart_EnterScope();
// PGconn *conn;
// const char *conninfo = "user=postgres password=postgres host=localhost port=5432";
// conn = PQconnectdb(conninfo);
//
// /* Check to see that the backend connection was successfully made */
// if (PQstatus(conn) != CONNECTION_OK)
// {
// fprintf(stderr, "Connection to database failed: %s",
// PQerrorMessage(conn));
// PQfinish(conn);
// exit(1);
// }
// PQfinish(conn);
Dart_Handle result = HandleError(Dart_NewInteger(0));
Dart_SetReturnValue(args, result);
Dart_ExitScope();
}
:私はこのように私の機能の接続をコメントし、新しいコードをテストした後
g++ -fPIC --verbose -I/home/{linux user}/Documents/dart/dart-sdk/include/ -lpq -I/usr/include/postgresql -c psql_dart.cc
gcc -shared -Wl,-soname,libpsql.so -o libpsql.so psql_dart.o
:
#include <string.h>
#include <stdio.h>
#include <libpq-fe.h>
#include "dart_api.h"
Dart_NativeFunction ResolveName(Dart_Handle name, int argc);
DART_EXPORT Dart_Handle psql_dart_Init(Dart_Handle parent_library) {
if (Dart_IsError(parent_library)) return parent_library;
Dart_Handle result_code =
Dart_SetNativeResolver(parent_library, ResolveName);
if (Dart_IsError(result_code)) return result_code;
return Dart_Null();
}
Dart_Handle HandleError(Dart_Handle handle) {
if (Dart_IsError(handle)) Dart_PropagateError(handle);
return handle;
}
void Connect(Dart_NativeArguments args) {
Dart_EnterScope();
PGconn *conn;
const char *conninfo = "user=postgres;password=postgres;host=localhost;port=5432;dbname=reviewdb";
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
PQfinish(conn);
}
Dart_Handle result = HandleError(Dart_NewInteger((int64_t) conn));
Dart_SetReturnValue(args, result);
Dart_ExitScope();
}
Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
assert(Dart_IsString8(name));
const char* cname;
Dart_Handle check_error = Dart_StringToCString(name, &cname);
if (Dart_IsError(check_error)) Dart_PropagateError(check_error);
Dart_NativeFunction result = NULL;
if (strcmp("Connect", cname) == 0) result = Connect;
Dart_ExitScope();
return result;
}
HTMLスクリプトは
<script type="application/dart" src="web/lib/psql.dart"></script>
<script type="application/dart" src="web/test_dart.dart"></script>
そして最後に、私のコンパイルコマンドラインを含めます
出力:
worked?
Segmentation fault (core dumped)
そして、私はまだSegFaultを考えていますか?
私はgdbのスタックトレースは:私はどこ
Starting program: /home/<user>/Documents/dart/dart-sdk/bin/dart test_dart.dart
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
worked?
Program received signal SIGSEGV, Segmentation fault.
dart::Api::NewHandle (isolate=0x948a40, raw=0x7ffff7f80021) at runtime/vm/dart_api_impl.cc:114
114 runtime/vm/dart_api_impl.cc: No such file or directory.
(gdb) bt
#0 dart::Api::NewHandle (isolate=0x948a40, raw=0x7ffff7f80021) at runtime/vm/dart_api_impl.cc:114
#1 0x000000000042e121 in dart::Dart_Invoke (target=<optimized out>, name=0x959b90, number_of_arguments=<optimized out>, arguments=<optimized out>) at runtime/vm/dart_api_impl.cc:3543
#2 0x00000000004097ee in main (argc=<optimized out>, argv=<optimized out>) at runtime/bin/main.cc:724
でコンパイルしようとしました。g ++ -O2 -DDART_SHARED_LIB -I/home/plaudet/Documents/dart/dart-sdk /インクルード-rdynamic -fPIC -shared dart_psql.cc -I/usr/include/postgresql -L/usr /lib/postgresql/9.1/lib -lpq -o dart_psql' まだ動作しません –
ネイティブ拡張の最小限のコードを試して再コンパイルしても、まだ動作しません。コンパイルと実行ができた人の助けが必要です任意のダーツネイティブ拡張。お願いします。 –
アプリケーションを実行しようとすると、現在受け取っているエラーは何ですか(ダーツエディタでdart-extのインポート構文を認識できないという問題があると思います)。しかし、あなたがそれを実行しようとすると、あなたは何を得るのですか?私はあなたの情報をコピーして 'libpsql.so'ファイルを取得し、#import( 'dart-ext:psql')しました。リソースを表示しても読み込めません(初期化機能が見つかりません) –