2010-03-23 13 views
11

मैं वैला का उपयोग कर मौजूदा जीएलआईबी आधारित सी प्रोजेक्ट पर हैक करना चाहता हूं।वाला वापी फाइलें प्रलेखन

असल में मैं अपनी बिल्ड प्रक्रिया की शुरुआत में, मेरी .vala फ़ाइलों से .c और .h फ़ाइलों को उत्पन्न करने के लिए वैलैक का उपयोग करके और फिर जेनरेट की गई फ़ाइलों को संकलित करने के तरीके को संकलित करता हूं। एच फाइल।

यह शायद सबसे अच्छा तरीका नहीं है, लेकिन अधिकांश भाग के लिए ठीक से काम कर रहा है।

मेरी समस्या यह है कि मुझे अपने वैल कोड से अपने मौजूदा सी कोड तक पहुंचने में कठिनाई हो रही है। क्या इसे करने का कोई आसान तरीका है?

मैंने अपनी खुद की .vapi फ़ाइलों को लिखने की कोशिश की है (मुझे वाल् के साथ आने वाले टूल के साथ कोई भाग्य नहीं था), लेकिन मुझे इन्हें लिखने के तरीके पर कोई सभ्य दस्तावेज नहीं मिल रहा है।

क्या कोई मौजूद है? मौजूदा सी कोड को कॉल करने के लिए मुझे इनमें से किसी एक फाइल की आवश्यकता है?

उत्तर

15

हां, सी फ़ंक्शन को कॉल करने के लिए, आपको इसके लिए बाध्यकारी लिखना होगा। प्रक्रिया को http://live.gnome.org/Vala/Tutorial#Binding_Libraries_with_VAPI_Files में वर्णित किया गया है, हालांकि, यह सीधे कस्टम फ़ंक्शंस या GObject के बिना लिखे गए पुस्तकालयों पर लागू नहीं होता है। यदि आपके पास गैर-गोब्जेक्ट पुस्तकालयों के लिए जटिल बाध्यकारी है तो आपको शायद #vala आईआरसी चैनल से मदद की आवश्यकता होगी।

हालांकि, अधिकांश समय, हम कुछ ऑटोकॉन्फ़ परिभाषा या सादे सी में लिखे गए कुछ कार्यों को दक्षता कारण या टूटा हुआ वाला, या जो भी अन्य कारण से बांधने के लिए सरल वापी फाइलों का उपयोग करते हैं।

myfunc.vapi

[CCode (cheader_filename = "myfunc.h")] 
namespace MyFunc { 
    [CCode (cname = "my_func_foo")] 
    public string foo (int bar, Object? o = null); 
} 

myfunc.h (और एक ग अपनी परियोजना के साथ जुड़ा हुआ में इसी कार्यान्वयन)

#include <glib-object.h> 
char* my_func_foo(int bar, GObject* o) 

example.vala: और इस तरह से है कि ज्यादातर लोग करते हैं हो सकता है

using MyFunc; 

void main() { 
    baz = foo(42); 
} 

जब valac साथ संकलन, --vapidir= का उपयोग निर्देशिका लो देने के लिए myfunc.vapi का cation। आपके निर्माण प्रणाली के आधार पर, आपको सब कुछ एक साथ जोड़ने के लिए वैलैक या जीसीसी CFLAGS को अतिरिक्त तर्क पारित करने की आवश्यकता हो सकती है।

+0

धन्यवाद! मेरी एक समस्या यह है कि जब मैं myfunc.vapi में हेडर फ़ाइल निर्दिष्ट करता हूं, तो वैलैक से .c आउटपुट #शामिल करता है जब मैं वास्तव में चाहता हूं # शामिल है "myfunc.h"। कुछ पता है इसे कैसे हल करना है? क्या यह हल करने योग्य है? – Jordan

+0

यह एक बड़ा सौदा नहीं होना चाहिए, जब तक कि आपके सिस्टम में फ़ाइल इंस्टॉल नहीं है, यह आपके प्रोजेक्ट निर्देशिका में खुलेगा, अगर आप पथ प्रदान करते हैं I (.. उदाहरण: -I $ (topsrc_dir)/libfoo) – elmarco

1

एल्मारको के उत्तर में एकमात्र जोड़ा मैं extern कीवर्ड है। यदि आप एक एकल सी फ़ंक्शन तक पहुंचने का प्रयास कर रहे हैं जो आपके किसी भी पैकेज या मानक सी/पॉज़िक्स पुस्तकालयों में पहले से उपलब्ध है, तो आप इसे आसानी से एक्सेस कर सकते हैं।

-1

सी से अपने वैला कोड तक पहुंचना शायद आसान होगा। जैसा कि आपको बस इतना करना है कि सी

1

सी में लिखी गई जीएलआईबी-आधारित पुस्तकालयों के लिए आप अपने सी-स्रोतों से जीआईआर-फाइलें उत्पन्न करने का प्रयास कर सकते हैं: Vala/Bindings

इसे मैन्युअल रूप से करना कोई समस्या नहीं है। मान लीजिए कि आपके पास एक लाइब्रेरी है जो SelibibClass1 को सी में परिभाषित करती है जिसे do_something कहा जाता है जो स्ट्रिंग लेता है। हेडरफ़ाइल का नाम "somelib.h" है। फिर संबंधित vapi निम्न के रूप में सरल है:

somelib।वापी: गैर चिकना पुस्तकालयों के लिए vapis लिखने के लिए

[CCode (cheader_filename="somelib.h")] 
namespace Somelib { 
    public class Class1 { 
     public void do_something (string str); 
    } 
} 

प्रलेखन यहां पाया जा सकता: Vala/LegacyBindings

यह वास्तव में बहुत आसान है।

[Compact] 
[CCode (cname = "FILE", free_function = "fclose", cheader_filename = "stdio.h")] 
public class FILE { 
    [CCode (cname = "fopen")] 
    public static FILE? open (string path, string mode); 

    [CCode (cname = "fgets", instance_pos = -1)] 
    public unowned string? gets (char[] s); 
} 

यह निम्नलिखित सी समारोह लागू करता है::

FILE *fopen (const char *path, const char *mode); 
char *fgets (char *s, int size, FILE *stream); 

जब instance_pos को त्यागकर विशेषता वाला मानता है कि वस्तु एक पद्धति के लिए पहले पैरामीटर है posix.vapi से एक अंश ले सकते हैं। इस तरह सी-संरचनाओं को बांधना संभव है जो लगभग वस्तु-उन्मुख हैं। कॉम्पैक्ट-क्लास का free_method तब कहा जाता है जब ऑब्जेक्ट को संदर्भित किया जाता है।

एक विधि, वर्ग, struct, आदि के CCode (CNAME) -attribute उसका नाम होने के लिए के रूप में यह सी में होगा है

नहीं है एक बहुत इस विषय को और अधिक है, लेकिन यह आपको एक सामान्य अवलोकन देना चाहिए।

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। संकेत के लिए –

+0

धन्यवाद। मैंने अपना जवाब संपादित किया। – Richard

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