bilakos10 Δημοσ. 9 Οκτωβρίου 2013 Δημοσ. 9 Οκτωβρίου 2013 Προσπαθώ να συμπεριλάβω κάποια headers (genlib.h και simpio.h) σε ένα δοκιμαστικό πρόγραμμα και συνεχώς μετά το compile παίρνω το ίδιο error "undefined reference to `GetReal" (ή GetInteger κτλ..) Τα headers φαίνονται να αναγνωρίζονται κανονικά από το Code::Blocks. Ωστόσο το error παραμένει. Τι μπορεί να παίζει; Υ.Σ τα headers έχουν δηλωθεί και στο Code::blocks και παράλληλα στο include βάζω το full path (για σιγουριά) Υ.Σ2 Το ίδιο έρρορ βγαίνει και στο eclipse.
παπι Δημοσ. 9 Οκτωβρίου 2013 Δημοσ. 9 Οκτωβρίου 2013 Οι headers ( *.h αρχεια) περιεχουν declarations Οι source ( *.c *.cpp ) περιεχουν definitions πχ main.cpp void myfunc(); // <-- declaration int main() { myfunc(); return 0; } //---> definition void myfunc() { //todo } Αυτο πως θα σπασει σε myfunc.h ? Καπως ετσι myfunc.h #ifndef INC_MYFUNC_H #define INC_MYFUNC_H void myfucn(); #endif myfunc.cpp void myfunc() { //todo } Πως το βαζουμε αυτο στην main? 1) κανουμε το include το declaration #include "myfunc.h" int main() { myfunc(); retunr 0; } 2) κανουμε import το definition 2a) Αν ειναι source ( *.c *.cpp ) τοτε το βαζουμε στο project. Πχ βαζουμε το myfunc.cpp στο project 2b) Αν ειναι lib, τοτε βαζουμε την lib στο project (γνωστο ως linking) Τι ειναι declaration και τι το θελουμε; Απλα, το η c/c++ κανει compile γραμμη γραμμη, που σημαινει οτι αν εχουμε αυτο void funcA() { funcB();//<-- compiler: Τι ειναι αυτο ???? δεν το εχω πετυχει στο δρομο μου. } void funcB() { } ο compiler θα σου πει οτι η funcB δεν υπαρχει. Μα εσυ τωρα θα μου πεις οτι ειναι απο κατω. Εμμ... Γραμμη γραμμη... ο compiler δεν την εχει δει ακομα γιατι ειναι απο κατω. Αρα ετσι βρηκαμε το declaration. void funcB(); //<-- καλε μου compiler, υπαρχει η funcB void funcA() { funcB();//<-- compile: ααα τωρα σε ειδα. } void funcB() { } Τι ειναι ο header? Ειναι ενα αρχειο το οποιο περιεχει μονο declarations. Τα declarations δεν ειναι απολυτος τιποτα, παρα μια γραμμη η οποια ενημερωνει τον compiler οτι υπαρχει ενα συμβολο. πχ #include <stdio.h> int rand(); int main() { printf("%d",rand()); } Αυτο θα τρεχει κανονικοτατα, ασχετα που δεν κανω include την math.h. Γιατι οπως ειπα. Ο header εχει μονο declarations Που ειναι το definition της rand ? Ειναι στο C run time library (CRTκατι.lib) η οποια ειναι by default "σεταρισμενη" στο project. Τελος. Τι ειναι αυτο το μνμ "undefined reference to 'GetReal' " ??? Αυτο μας λεει οτι εχεις ενα declaration (το GetReal) αλλα δεν εχεις το definition 4
bilakos10 Δημοσ. 10 Οκτωβρίου 2013 Μέλος Δημοσ. 10 Οκτωβρίου 2013 Ωπ μάλλον πρέπει να ξέχασα να βάλω το lib στο project... Θα το δοκιμάσω αύριο να το τοποθετήσω και θα ενημερώσω. Χίλια ευχαριστώ για την αναλυτική απάντηση παπι!
Timonkaipumpa Δημοσ. 10 Οκτωβρίου 2013 Δημοσ. 10 Οκτωβρίου 2013 Είσαι σίγουρος ότι είναι compile λάθος ή μήπως είναι linking λάθος; Εάν είναι το 2ο, τότε (και διαβάζοντας όσα σου έγραψε ο παπι) με το να προσθέσεις το lib στο project θα είσαι ΟΚ.
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Πρόσθεσα το lib αλλά και πάλι μου έβγαζε το ίδιο ερρορ, οπότε είπα να το προσπαθήσω με τερματικό και gcc,πάλι τίποτα όμως bill@debian:~/Desktop$ gcc -o makemyfile -I/home/bill/include -L/home/bill/lib -lole main.c -Wall /tmp/ccIW5gFH.o: In function `main': main.c:(.text+0xa): undefined reference to `GetInteger' collect2: ld returned 1 exit status bill@debian:~/Desktop$ cat main.c #include <stdio.h> #include "genlib.h" #include "simpio.h" int main (void){ int a = GetInteger(); printf("%d", a); return 0; } bill@debian:~/Desktop$ ls /home/bill/include exception.h gcalloc.h genlib.h graphics.h random.h simpio.h strlib.h bill@debian:~/Desktop$ ls /home/bill/lib libole.a
imitheos Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Στις 11/10/2013 στις 3:04 ΜΜ, bilakos10 είπε Πρόσθεσα το lib αλλά και πάλι μου έβγαζε το ίδιο ερρορ, οπότε είπα να το προσπαθήσω με τερματικό και gcc,πάλι τίποτα όμως bill@debian:~/Desktop$ gcc -o makemyfile -I/home/bill/include -L/home/bill/lib -lole main.c -Wall /tmp/ccIW5gFH.o: In function `main': main.c:(.text+0xa): undefined reference to `GetInteger' collect2: ld returned 1 exit status Αν τρέξεις gcc -o makemyfile -I/home/bill/include -L/home/bill/lib main.c -Wall -loleσου λειτουργεί ?
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Όχι πάλι τα ίδια βγάζει. Επίσης το ίδιο έρρορ βγάζει αν φτιάξω το αντικείμενο πρόγραμμα του main.c και στην συνέχεια το συνδέσω με την βιβλιοθήκη libole.a
imitheos Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 χμ θα έπρεπε να λειτουργεί βάζοντας την -lole μετά το main.c Πως δημιούργησες την libole.a ? Αν τρέξεις "file libole.a" τι παίρνεις ?
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Αν τρέξω"file libole.a" Παίρνω: libole.a: current ar archive. Την βιβλιοθήκη δεν την δημιούργησα εγώ, αλλά μας την έδωσαν από το πανεπιστήμιο για να μπορούμε να χρησιμοποιούμε στην C κάποιες εντολές. Υ.Σ Σε περιβάλλον Windows με devcpp το πρόγραμμα γίνεται compiled κανονικά αφού πρώτα προσθέσω τα includes και τo lib στους ανάλογους καταλόγους. Υ.Σ2 Εδώ είναι και το pdf που λέει για την εγκατάσταση σε win http://compus.uom.gr/INF122/document/Diafora/InstructionsWxDev_v2.pdf
imitheos Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Δηλαδή τα objects μέσα στο archive είναι για windows ? Τρέξε το εξής: cd /tmp mkdir aa cd aa ar x /home/bill/lib/libole.a file *.oκαι γράψε μας το αποτέλεσμα για ένα από όλα τα object files
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Ορίστε: genlib.o: 80386 COFF executable not stripped - version 30821 (Όπως είπα χρησιμοποιώντας κατευθείαν τα objects αντί της βιβλιοθήκης παίρνω πάλι τα ίδια errors)
migf1 Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Αν και δεν διάβασα το pdf, εφόσον το wxdevc++ δεν τρέχει πουθενά εκτός από Windows, είναι πιστεύω ασφαλές να υποθέσουμε πως τα libraries που σας έχουν δώσει έχουν γίνει compile σε Windows. Πιθανότατα λοιπόν αυτό ακριβώς είναι και το πρόβλημά σου (λογικά με κάποια έκδοση του mingw). Ζήτησε να δώσουν τον πηγαίο κώδικα της βιβλιοθήκης ώστε να την κάνεις compile μόνος σου, ή ζήτα τους να σου δώσουν τα object files για το λειτουργικό σου σύστημα (για σιγουριά με την ίδια έκδοση του compiler που έχεις κι εσύ). Ή δοκίμασε σε προσομοιωμένο περιβάλλον Windows, π.χ. με Wine, να δουλέψεις απευθείας με το wx-devc++. 1
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Κι όλα αυτά για να μην μπερδεύονται οι υπόλοιποι με το scanf και τα συναφή
imitheos Δημοσ. 11 Οκτωβρίου 2013 Δημοσ. 11 Οκτωβρίου 2013 Στις 11/10/2013 στις 4:29 ΜΜ, bilakos10 είπε Ορίστε: genlib.o: 80386 COFF executable not stripped - version 30821 Ναι. Τα αρχεία σου δεν προορίζονται να τρέξουν σε linux για αυτό και δεν βρίσκει τίποτα ο linker. Ή θα πρέπει να δουλέψεις σε Windows ή θα πρέπει να δώσουν τον κώδικα της βιβλιοθήκης και να τον κάνεις compile εσύ όπως πρότεινε και ο migf1.
bilakos10 Δημοσ. 11 Οκτωβρίου 2013 Μέλος Δημοσ. 11 Οκτωβρίου 2013 Σας ευχαριστώ πολύ παιδιά και τους 2 σας για τον χρόνο που αφιερώσατε! Θα επικοινωνήσω με το πανεπιστήμιο και θα σας ενημερώσω όταν βγάλω άκρη!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα