2012-10-02 12 views
6

私は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 
+0

でコンパイルしようとしました。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' まだ動作しません –

+0

ネイティブ拡張の最小限のコードを試して再コンパイルしても、まだ動作しません。コンパイルと実行ができた人の助けが必要です任意のダーツネイティブ拡張。お願いします。 –

+0

アプリケーションを実行しようとすると、現在受け取っているエラーは何ですか(ダーツエディタでdart-extのインポート構文を認識できないという問題があると思います)。しかし、あなたがそれを実行しようとすると、あなたは何を得るのですか?私はあなたの情報をコピーして 'libpsql.so'ファイルを取得し、#import( 'dart-ext:psql')しました。リソースを表示しても読み込めません(初期化機能が見つかりません) –

答えて

2

あなたのコードでいくつかの周りに遊んとPostgreSQL-DEV-9.1パッケージがインストール取得した後、これはあります。現時点ではまだ実行されていませんが、インポート自体が原因ではなく、リンクエラーが原因です。

注あなたのC++ファイルへの変更は:ちょうどpsql_Init

// libpsql.cc 
#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_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; 
} 

psql_dart_Initそして、次は私の第一ダーツファイルです:私からあなたの初期化関数の名前を変更し、その後

// psql.dart 
#library("psql"); 

#import("dart-ext:psql"); 

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'; 

そして実際それをテストするための最小限のアプリケーション(dartiumベースではなくコマンドライン)。

// test.dart 
#import('psql.dart'); 

main() { 
    var database = new Database('localhost', 'mbutler', 'test', 'test'); 

    if(database != null) { 
    print('worked?'); 
    } 
} 

私は次のコマンドを使用してコンパイルしてリンクしています。正しく動作します。私はに接続するために有効なデータベースを持っていないので、私はセグメンテーションフォールトが、以下では、適切ネイティブライブラリをロードします:

g++ -O2 -DDART_SHARED_LIB -I/home/<user>/dart/dart-sdk/include -rdynamic -fPIC -shared libpsql.cc -lpq -I/usr/include/postgresql -o libpsql.so 

dart-sqliteビルドスクリプトのおかげで一緒に私は必要なリンクをつなぎすることができました)

+0

良い点ですが、私はまだ 'dart-ext:psql'リソースを読み込めませんでした:-( –

2

C/C++言語の小さなプロジェクトをコンパイルする場合。

特にネイティブダーツエクステンションです。 次に、この小さなツールセットを試すことができます。 次のタスクを編成できます。

  1. プロジェクトをyamlまたはjsonファイルとして1つのファイルに編成します。
  2. 複数のプラットフォームをサポートするプロジェクトを整理します。
  3. これらのプロジェクトをDart言語スクリプトから直接ビルドします。
  4. 異なるプラットフォーム用のバッチファイルを作成する必要がありません。

これらのツールは、pubパッケージマネージャを使用してDartパッケージとしてインストールして使用できます。

また、ネイティブエクステンションを作成する簡単な例と、Dart言語スクリプトからプロジェクトを迅速に構築する(プロジェクトをコンパイル、リンク、クリーンアップする)方法の例が含まれています。

このツールセットは、ccompileと呼ばれます。

あなたは、私は、これはあなたに役立つことを願っていますhttps://github.com/mezoni/ccompile

でgithubの上のツールのセットを見つけることができます!

+0

既にこのプロジェクトを見て、私はこのプロジェクトを開始しました。私の上司。ありがとう。 –

関連する問題