Dart

2012-10-02 14 views
6

Sto provando a creare un'estensione nativa in dart per postgresql. Ho compilato il file CC in .o quindi in .so (oggetto condiviso credo). Ora è chiamato libpsql.so e l'ho inserito nella stessa directory del mio file .dart. La prima riga del file dardo è #import (dart-ext: libpsql); ma continua a dirmi che le risorse non sono disponibili.Dart

Il mio codice dardo

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

E qui è il mio codice C++.

#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 sceneggiatura includono

<script type="application/dart" src="web/lib/psql.dart"></script> 
    <script type="application/dart" src="web/test_dart.dart"></script> 

E l'ultimo, il mio compilazione riga di comando:

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 

Dopo aver testato il nuovo codice ho commentato la mia funzione di collegare in questo modo:

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(); 
} 

L'uscita :

worked? 
Segmentation fault (core dumped) 

E ho ancora qualche idea su SegFault?

mio gdb stacktrace:

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

la compilazione con 'g ++ -O2 -DDART_SHARED_LIB -I/home/plaudet/Documents/dardo/dardo-sdk/include -rdynamic -fPIC -shared dart_psql.cc -I/usr/include/PostgreSQL -L/usr /lib/postgresql/9.1/lib -lpq -o dart_psql' Ancora non funziona –

+0

Ho provato il codice minimo per l'estensione nativa, ricompilato, ancora non funziona, ho bisogno dell'aiuto di qualcuno che è stato in grado di compilare ed eseguire qualsiasi estensione nativa del dardo. Per favore. –

+0

Quali errori stai attualmente ricevendo quando provi ad eseguire l'applicazione (nota che c'è un problema con il dart-editor che non riconosce la sintassi di importazione dart-ext). Ma quando provi ad eseguirlo cosa ottieni? Quando ho compilato la copia delle informazioni per ottenere un file 'libpsql.so' e I #import ('dart-ext: psql'); vede la risorsa ma non riesce a caricarla (non trova la funzione di inizializzazione) –

risposta

2

Dopo aver suonato in giro un po 'con il tuo codice e ottenere il pacchetto postgresql-dev-9.1 installato questo è dove mi trovo. Attualmente non viene ancora eseguito, tuttavia è dovuto a un errore di collegamento non dovuto all'importazione stessa.

nota un cambiamento al file C++: ho rinominato la funzione di inizializzazione da: psql_dart_Init a poco 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; 
} 

E il seguente è il mio primo file di dardo:

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

E poi il vero e proprio Applicazione MOLTO minimale (riga di comando anziché su base di dartium) per testarlo.

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

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

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

Ho usato il seguente comando per compilare e collegare in un colpo solo e io funziona correttamente. Mi segfault perché io non ho un database valido per connettersi ma il seguente lo fa caricare la libreria nativa correttamente:

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 

(Grazie a dart-sqlite script di build è stata in grado di mettere insieme il legame che ho richiesto)

+0

Buon punto, ma ho ancora ottenuto il 'Impossibile caricare la risorsa dart-ext: psql' :-( –

2

Se vuoi compilare i piccoli progetti nel linguaggio C/C++.

In particolare estensione del dardo nativo. Allora puoi provare questo piccolo set di strumenti. Permette di organizzare le seguenti attività.

  1. Organizzare un progetto in un singolo file come file yaml o json.
  2. Organizzare un progetto per il supporto di building multipiattaforma.
  3. Costruire questi progetti direttamente dagli script di lingua Dart.
  4. Elimina la necessità di scrivere file batch per piattaforme diverse.

È possibile installare questi strumenti come pacchetto Dart tramite il gestore di pacchetti pub e utilizzarlo.

Inoltre, contiene un semplice esempio di creazione di un'estensione nativa e un esempio di come crearlo rapidamente (complilo, collegamento e pulisci progetto) dallo script di lingua Dart.

Questo set di strumenti si chiama ccompile.

È possibile trovare questo set di strumenti su GitHub a https://github.com/mezoni/ccompile

Spero che questo sarà utile a voi!

+0

Ho già dato un'occhiata a quel progetto, ho iniziato con questo progetto. Per gli strumenti ccompile gli sto dando un'occhiata con il mio capo, grazie. –