2012-10-02 15 views
6

मैं postgresql के लिए डार्ट में मूल एक्सटेंशन बनाने की कोशिश कर रहा हूं। मैंने सीसी फ़ाइल को .o में संकलित किया है। इसलिए (साझा ऑब्जेक्ट मुझे लगता है)। अब इसे libpsql.so नाम दिया गया है और मैंने इसे अपनी .dart फ़ाइल के समान निर्देशिका में रखा है। डार्ट फ़ाइल की पहली पंक्ति # आयात (डार्ट-एक्सटी: libpsql) है; लेकिन यह मुझे बताता रहता है कि संसाधन अनुपलब्ध है।देशी एक्सटेंशन डार्ट

मेरे डार्ट कोड

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

और यहाँ मेरी सी ++ कोड है।

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 

नए कोड मैं टिप्पणी की परीक्षण के बाद मेरी समारोह इस तरह कनेक्ट करें:

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

#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) 

और मुझे अभी भी सेगफॉल्ट कोई विचार है?

मेरे 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

की कोशिश की 'जी ++ -O2 -DDART_SHARED_LIB मैं/घर/plaudet/दस्तावेज़/डार्ट/डार्ट-sdk के साथ संकलन/शामिल -rdynamic -fPIC कमरा साझा dart_psql.cc मैं/usr/शामिल/PostgreSQL एल/usr /lib/postgresql/9.1/lib -lpq -o dart_psql' अभी भी काम नहीं करते –

+0

मूल एक्सटेंशन के लिए न्यूनतम कोड का प्रयास किया, पुनः संकलित, अभी भी काम नहीं करता है, किसी ऐसे व्यक्ति से मदद चाहिए जो संकलन और चलाने में सक्षम था किसी भी डार्ट देशी विस्तार। कृप्या। –

+0

एप्लिकेशन चलाने की कोशिश करते समय आपको वर्तमान में क्या त्रुटियां मिल रही हैं (नोट मुझे लगता है कि डार्ट-एडिटर के साथ कोई समस्या है जो डार्ट-एक्सटी आयात वाक्यविन्यास को पहचान नहीं रही है)। लेकिन जब आप इसे चलाने की कोशिश करते हैं तो आपको क्या मिलता है? जब मैंने 'libpsql.so' फ़ाइल प्राप्त करने के लिए अपनी जानकारी की प्रतिलिपि बनाई, और मैं # आयात ('डार्ट-एक्सटी: psql'); यह संसाधन देखता है लेकिन इसे लोड नहीं कर सकता है (initilization फ़ंक्शन नहीं मिल सकता) –

उत्तर

2

अपने कोड के साथ कुछ आसपास खेल रहे हैं और हो रही PostgreSQL-देव-9.1 पैकेज स्थापित करने के बाद यह है मैं कहाँ हूँ। वर्तमान में यह अभी भी नहीं चल रहा है, हालांकि यह एक लिंकिंग त्रुटि के कारण आयात के कारण नहीं है।

नोट अपने सी ++ फाइल करने के लिए एक परिवर्तन: सिर्फ 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 और निम्नलिखित मेरी 1 डार्ट फ़ाइल है:: मैं से अपने आरंभीकरण समारोह का नाम बदला

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

और फिर वास्तविक इसका परीक्षण करने के लिए बहुत कम एप्लिकेशन (डार्टियम-आधारित के बजाय कमांड लाइन)।

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

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

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

मैंने एक कमांड में संकलन और लिंक करने के लिए निम्न आदेश का उपयोग किया और मैं सही तरीके से काम करता हूं। मैं SEGFAULT क्योंकि मैं करने के लिए कनेक्ट करने के लिए एक वैध डेटाबेस नहीं है, लेकिन निम्नलिखित देशी पुस्तकालय ठीक से लोड करता है:

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 

+0

अच्छा बिंदु, लेकिन मुझे अभी भी 'संसाधन डार्ट-एक्सटी लोड करने में विफल: psql' :-( –

2
( dart-sqlite के लिए धन्यवाद निर्माण स्क्रिप्ट जोड़ने मैं आवश्यक एक साथ टुकड़ा करने में सक्षम था)

यदि आप भाषा सी/सी ++ में छोटी परियोजनाओं को संकलित करना चाहते हैं।

विशेष रूप से देशी डार्ट एक्सटेंशन में। फिर आप टूल के इस छोटे से सेट को आजमा सकते हैं। यह आपको निम्न कार्यों को व्यवस्थित करने की अनुमति देता है।

  1. एक परियोजना को यामल या जेसन फ़ाइल के रूप में एक फ़ाइल में व्यवस्थित करें।
  2. समर्थन बहु-मंच निर्माण के लिए एक परियोजना आयोजित करें।
  3. डार्ट भाषा स्क्रिप्ट से सीधे इन परियोजनाओं का निर्माण।
  4. विभिन्न प्लेटफ़ॉर्म के लिए बैच फ़ाइलों को लिखने की आवश्यकता को समाप्त करता है।

आप इन उपकरणों को पब पैकेज प्रबंधक के माध्यम से डार्ट पैकेज के रूप में स्थापित कर सकते हैं और इसका उपयोग कर सकते हैं।

इसके अलावा, इसमें मूल एक्सटेंशन बनाने और डार्ट भाषा स्क्रिप्ट से इसे त्वरित रूप से बनाने (अनुपालन, लिंक और साफ़ प्रोजेक्ट) बनाने का उदाहरण शामिल है।

उपकरण के इस सेट को कॉम्पाइल कहा जाता है।

आप https://github.com/mezoni/ccompile

मुझे आशा है कि यह आपके लिए उपयोगी साबित होगा GitHub पर उपकरण के इस सेट प्राप्त कर सकते हैं!

+0

पहले से ही उस प्रोजेक्ट पर एक नज़र डाली, मैंने इस प्रोजेक्ट के साथ शुरुआत की। कॉम्पाइल टूल के लिए मैं इसे देख रहा हूं मेरे मालिक। धन्यवाद। –

संबंधित मुद्दे