|
Îåêßíçóå áðü ôï ìÝëïò tasos. Τελευταία δημοσίευση από το μέλος dva στις 31-03-2007, 04:58. Υπάρχουν 10 απαντήσεις.
-
26-03-2007, 15:04
|
-
tasos
-
-

-
Μέλος από τις 13-11-2006
-
Θεσσαλονίκη
-
Δημοσιεύσεις 283
-
-
|
Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Έχω βρει στο web μία βιβλιοθήκη σε Visual C++ και θέλω να την ενσωματώσω σε ένα δικό μου project το οποίο είναι γραμμένο σε VB. Όταν κάνω build το C++ project, δημιουργεί ένα .lib αρχείο, δηλαδή ένα static library. Δεν με αφήνει να κάνω Add Reference στο δικό μου project. Δοκίμασα να αλλάξω κάποιες παραμέτρους για να δημιουργήσω dynamic library αλλά μου έβγαλε πολλά link errors στο build. Τι μπορώ να κάνω έτσι ώστε να μπορέσω να χρησιμοποιήσω τις κλάσεις που είναι ορισμένες στο C++ project;
Υ.Γ. Έξαψα και βρηκά σε κάποια forums κάποια post που να ρωτούν ακριβώς για το ίδιο πράγμα. Απάντηση δεν υπήρχε, μήπως δεν είναι εφικτή η χρήση static library μαζί με Visual Basic;
Τάσος Καραγιάννης Baby debugging steps...
|
|
-
27-03-2007, 09:19
|
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Ο πιο απλός τρόπος να το κάνεις αυτό, είναι να δημιουργήσεις μια managed assembly σε C++, στην οποία θα κάνεις link και θα καλείς τη static library, και να κάνεις reference την νέα assembly. Αυτό σημαίνει ότι πιθανώς να πρέπει να μετατρέψεις το API που σου δίνει η static library, σε κάτι πιο object based.
Νατάσα Μανουσοπούλου
|
|
-
27-03-2007, 12:33
|
-
tasos
-
-

-
Μέλος από τις 13-11-2006
-
Θεσσαλονίκη
-
Δημοσιεύσεις 283
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Ας πούμε ότι η βιβλιοθήκη λέγεται Tools, και εγώ φτιάχνω μια class library ManagedTools, στην οποία κάνω Add reference το project Tools. Το μόνο που έκανα στην ManagedTools μία απλή κλάση με μία συνάρτηση, απλά για να υπάρχει κάποιος κώδικας. Όταν κάνω build Solution λαμβάνω το μήνυμα Error 1 fatal error C1113: #using failed on 'f:\tasos - documents\visual studio 2005\projects\toolsolution\debug\tools.lib' f:\Tasos - Documents\Visual Studio 2005\Projects\ToolSolution\ManagedTools\Stdafx.cpp 1 Δεν ξέρω τι ακριβώς είναι το #using, πρέπει να προσθέσω κάποια γραμμή κώδικα ; (προφανώς αλλά τι;!)
Τάσος Καραγιάννης Baby debugging steps...
|
|
-
27-03-2007, 14:05
|
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Υποθέτω ότι το project Tools είναι η βιβλιοθήκη σε C++? Αν είναι έτσι, δεν μπορείς απλά να βάλεις ένα assembly reference σε ένα Managed C++ project και να περιμένεις να δουλέψει. Είναι το ίδιο σαν να προσπαθείς να βάλεις το reference στην C# ή την VB. Μία βιβλιοθήκη lib είναι μεν compiled κώδικας αλλά δεν μπορεί να χρησιμοποιηθεί ανεξάρτητα από κάποια άλλη εφαρμογή C++. Όταν γίνεται build μία εφαρμογή C++ ουσιαστικά κάνει compile το source κώδικα σε binary αρχεία με κατάληξη obj, προσθέτει όσα lib χρειάζονται (runtime, windows libraries κλπ) και φτιάχνει ένα exe. Τα lib χρησιμοποιούνται είτε για να σπάσει ένα μεγάλο project σε modules είτε όταν κάποιος δεν θέλει να δώσει το source κώδικα για τη βιβλιοθήκη που έφτιαξε. Όπως καταλαβαίνεις, ο μόνος που μπορεί να χρησιμοποιήσει ένα lib είναι ο compiler της C++. Για να χρησιμοποιήσεις ένα lib σε ένα οποιοδήποτε project Visual C++ πρέπει να το προσθέσεις στις ιδιότητες του project, στο Linker, Input, Additional Dependencies. Πρέπει επίσης να ορίσεις σε ποιά directories θα κοιτάξει ο linker για να βρει το lib. Αυτό το ορίζεις στο Linker, General, Additional Library Directories. Τέλος, πρέπει να προσθέσεις τα header αρχεία που έρχονται με το lib στο project σου με την "εντολή" #include, σε κάθε αρχείο στο οποίο θέλεις να τη χρησιμοποιήσεις. Επειδή αυτό είναι κουραστικό και αυξάνει πολύ το χρόνο του compile, τα ποιο συχνά χρησιμοποιούμενα headers προστίθενται στο αρχείο stdafx.h. Ο compiler ξέρει και χειρίζεται με διαφορετικό τρόπο αυτό το αρχείο, καθώς ξέρει ότι αυτό γίνεται #include σε όλα τα άλλα αρχεία και το κάνει compile μόνο μία φορά. Ένα DLL είναι μεν βιβλιοθήκη, έχει όμως φτιαχτεί με ιδιαίτερο τρόπο. Έχουν προστεθεί από τον compiler επιπλέον στοιχεία και κώδικας που επιτρέπουν σε οποιαδήποτε εφαρμογή να φορτώσει ένα αρχείο DLL και να καλέσει τα functions που περιλαμβάνει, ενώ πρέπει να κάνει include και τα κατάλληλα header και lib αρχεία. Τα function που μπορείς να καλέσεις από άλλες εφαρμογές σημαδεύονται ως export. Όταν δημιουργείς ένα καινούριο Win32 Project τύπου DLL, το Visual Studio δημιουργεί ένα project το οποίο περιέχει ήδη τα κατάλληλα includes και libraries. Όπως καταλαβαίνεις, δεν μπορείς απλά να πάρεις ένα static library project (lib) και να το κάνεις DLL αλλάζοντας μόνο τον τύπο του executable στις ιδιότητες του compile. Για να δημιουργήσεις ένα DLL μπορείς να φτιάξεις ένα Win32 Project τύπου DLL και μετά να προσθέσεις σε αυτό το lib και το header της βιβλιοθήκης που θέλεις. Μετά, θα πρέπει να γράψεις τα δικά σου export functions στο DLL τα οποία θα καλούν τα functions του Lib. Η άλλη λύση, είναι να αντιγράψεις τον κώδικα από το lib project μέσα στο Dll project. Και πάλι όμως θα πρέπει να προσθέσεις εσύ τα export functions. Αυτό που πρότεινε η Νατάσα είναι αντί να δημιουργήσεις ένα DLL project, να δημιουργήσεις ένα Managed C++ project μέσα στο οποίο μπορείς να αντιγράψεις τον κώδικα του library ή να προσθέσεις το lib και το header του ως unmanaged κώδικα. Αυτό έχει το καλό ότι δεν θα χρειαστεί να καλέσεις από τη VB το DLL χρησιμοποιώντας P/Invoke, οπότε θα είναι ταχύτερο. Και πάλι όμως θα χρειαστεί είτε να κάνεις αλλαγές στον κώδικα του library για να μπορέσει να κάνει compile, ή να γράψεις τις κατάλληλες κλάσεις και μεθόδους που θα καλέσουν τα functions του lib. Σε κάθε περίπτωση θα πρέπει να ξέρεις C++ και πως να κάνεις compile τα διαφορετικά είδη project πρωτού προσπαθήσεις να φτιάξεις είτε DLL είτε Managed C++ assembly.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
27-03-2007, 17:00
|
-
tasos
-
-

-
Μέλος από τις 13-11-2006
-
Θεσσαλονίκη
-
Δημοσιεύσεις 283
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Παναγιώτης Καναβός: Για να χρησιμοποιήσεις ένα lib σε ένα οποιοδήποτε project Visual C++ πρέπει να το προσθέσεις στις ιδιότητες του project, στο Linker, Input, Additional Dependencies. Πρέπει επίσης να ορίσεις σε ποιά directories θα κοιτάξει ο linker για να βρει το lib. Αυτό το ορίζεις στο Linker, General, Additional Library Directories. Τέλος, πρέπει να προσθέσεις τα header αρχεία που έρχονται με το lib στο project σου με την "εντολή" #include, σε κάθε αρχείο στο οποίο θέλεις να τη χρησιμοποιήσεις. Επειδή αυτό είναι κουραστικό και αυξάνει πολύ το χρόνο του compile, τα ποιο συχνά χρησιμοποιούμενα headers προστίθενται στο αρχείο stdafx.h. Ο compiler ξέρει και χειρίζεται με διαφορετικό τρόπο αυτό το αρχείο, καθώς ξέρει ότι αυτό γίνεται #include σε όλα τα άλλα αρχεία και το κάνει compile μόνο μία φορά.
Δημιούργησα ένα Win32 project και επέλεξα το configuration type στον wizard να είναι exe. Ακολούθησα τα παραπάνω βήματα αλλά έχω κάποιο πρόβλημα με το #include. Δοκίμασα #include "Tools.h", #include <Tools.h>, #include "Tools.lib" και #include <Tools.lib>, ακόμα και <Tools>, "Tools" και μου λέει ότι δεν βρίσκει το αρχείο. Το Tools είναι σε Visual C++. Συγκεκριμένα: Linker, Input, Additional Dependencies = Tools.lib πλήρες μονοπάτι C:\Tools\Tools.lib Linker, General, Additional Library Directories = 'C:\Tools\' #include ?? Υ.Γ. Έχει διαφορά το managed assembly σε C++/ Managed C++ project από το CLR Class Library; Εγώ μάλλον καταλαβαίνω το ίδιο πράγμα.
Τάσος Καραγιάννης Baby debugging steps...
|
|
-
28-03-2007, 13:20
|
-
Dimitris
-
-
-
Μέλος από τις 16-12-2004
-
-
Δημοσιεύσεις 52
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Από C++ έχω μικρή πείρα αλλά είμαι σχεδόν σίγουρος οτι τα #include "Tools.lib" και #include <Tools.lib> είναι άκυρα. Ο compiler χρειάζεται να ξέρει μονο τις δηλώσεις που υπάρχουν στα .h αρχεία.
|
|
-
28-03-2007, 13:38
|
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Πράγματι, μόνο τα #include "tools.h" ή #include <tools.h> είναι σωστά. Η #include λέει στον compiler να συμπεριλάβει το συγκεκριμένο αρχείο κατά το compile. Όταν γράφουμε "tools.h" σημαίνει ότι το αρχείο tools.h θα βρεθεί στο project folder, μαζί με τα υπόλοιπα αρχεία ενός project. Όταν γράφουμε <tools.h> σημαίνει ότι το αρχείο θα βρεθεί σε κάποιο από τα folders που έχουν οριστεί είτε στα properties του project, ή στα Options του ίδιου του Visual Studio.
Ίσως πρέπει να το πω πιο ξεκάθαρα. Δεν είναι εύκολο να γράψει και να κάνει κάποιος compile ένα project σε C++ αν δεν ξέρει από C++. Δεν είναι κάτι που απαντιέται με 1-2 ερωτήσεις σε ένα forum. Θέλει διάβασμα και προσοχή, και να ξεκινήσει κανείς με απλά βήματα. Όλα όσα χρειάζεται κανείς περιγράφονται στο help του Visual Studio. Καλό είναι (μάλλον απαραίτητο) να το διαβάσει κανείς πρώτα για να καταλάβει τί είναι και πως δουλεύουν ο compiler, ο linker, τα static libraries, τί θα πει managed/unmanaged κώδικας και πως αναμιγνύονται. Μετά ας φτιάξει ένα απλό project για να δει πως δουλεύουν. Πρώτα ένα managed assembly με μία κλάση και ένα function. Μετά ένα static library με ένα μόνο function. Μετά συνδυάζουμε το static library με το managed assembly. Και μετά, κάνουμε και το κυρίως project.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
28-03-2007, 15:40
|
-
tasos
-
-

-
Μέλος από τις 13-11-2006
-
Θεσσαλονίκη
-
Δημοσιεύσεις 283
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Ξέρω C++ αλλά έχω δουλέψει με g++ μόνο, οπότε πρακτικά δυσκολεύομαι με
τη διαδικασία του compile. Εντάξει, σωστό θα είναι το Tools.h (το μόνο
λογικό, αλλά όταν αυτό δεν δουλεύει δοκίμασα και τα άλλα), αλλά πάλι
δεν μπορώ να καταλάβω πως θα γίνει το δικό μου project να "δει" το
static library. Πρέπει να δώσω κάπου και το μονοπάτι από το αρχείο
Tools.h (το οποίο βρίσκεται σε διαφορετικό project); Αν ναι, που πρέπει
να γίνει αυτό; Μάλλον η λύση δεν είναι τόσο απλή. Θα κάνω post τη λύση,
όταν θα έχω καταλήξει σε κάτι.
Σε ευχαριστώ πάντως Παναγιώτη για το χρόνο σου και για τις αναλυτικές
απαντήσεις, σίγουρα βοήθησαν να ξεκαθαριστούν κάποια πράγματα.
Τάσος Καραγιάννης Baby debugging steps...
|
|
-
28-03-2007, 16:09
|
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Η Visual C++ και το g++ δεν έχουν διαφορά στο χειρισμό των #include, καθώς αυτά είναι χαρακτηριστικό της γλώσσας, όχι του compiler. Εφόσον το tools.h δεν βρίσκεται στο folder του project που γίνεται compile, θα πρέπει να προστεθεί το path στο command line του compiler, ή στο make file. Διαφορετικά και το g++ και το Visual Studio θα σου πουν ότι δεν βρήκαν το αρχείο.
Που τα ρυθμίζεις αυτά: Για όλο το Visual Studio: πήγαινε Tools -> Options -> Projects and Solutions -> VC++ Directories. Στο Combobox "Show Directories for", διάλεξε "Include Files" για να θέσεις τα directories στα οποία θα γίνεται η αναζήτηση για headers, "Library Files" για dlls και libs.
Για ένα συγκεκριμένο project: Διάλεξε το project και από το context menu διάλεξε Properties. Για τα header files, πήγαινε στο Configuration Properties -> C/C++ και πρόσθεσε τα folder που περιλαμβάνουν επιπλέον include files στο Additional Include Directories. Για τα libraries και τα dlls, πήγαινε στο Linker (για .ΝΕΤ assemblies) ή Librarian (για Win32) και βάλε τα folders στο Additional Library Directories.
Κοίτα και το help. Περιέχει ότι θέλεις να μάθεις καθώς και walkthroughs για το πως να δημιουργήσεις και να χρησιμοποιήσεις dlls, libraries και assemblies
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
30-03-2007, 18:09
|
-
tasos
-
-

-
Μέλος από τις 13-11-2006
-
Θεσσαλονίκη
-
Δημοσιεύσεις 283
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Με όλα αυτά λοιπόν είμαι μάλλον οκ. Τώρα μπορώ να χρησιμποιήσω το static lib σε ένα CLR Class Library. Thanks Παναγιώτη!
Τάσος Καραγιάννης Baby debugging steps...
|
|
-
31-03-2007, 04:58
|
-
dva
-
-

-
Μέλος από τις 11-11-2006
-
-
Δημοσιεύσεις 25
-
-
|
Απ: Χρήση static library (C++) σε Visual Basic project (Visual Studio 2005)
Πιστεύω πως είναι πιο εύχρηστο (και πιο ξεκάθαρο) να μπεί στον κώδικα το #pragma για να κάνει link με την αντίστοιχη library, από το να πηγαίνεις στα properties του project. ... #include <tools.h> #pragma comment (lib, "tools") //link with tools.lib ...
|
|
|
|
|