Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώ να συμπεριλάβω κάποια headers (genlib.h και simpio.h) σε ένα δοκιμαστικό πρόγραμμα και συνεχώς μετά το compile παίρνω το ίδιο error "undefined reference to `GetReal" (ή GetInteger κτλ..) 

Τα headers φαίνονται να αναγνωρίζονται κανονικά από το Code::Blocks.

Ωστόσο το error παραμένει.

 

Τι μπορεί να παίζει;

 

Υ.Σ τα headers έχουν δηλωθεί και στο Code::blocks και παράλληλα στο include βάζω το full path (για σιγουριά)

Υ.Σ2 Το ίδιο έρρορ βγαίνει και στο eclipse.

 

Δημοσ.

Οι 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 

  • Like 4
Δημοσ.

Ωπ μάλλον πρέπει να ξέχασα να βάλω το lib στο project...

Θα το δοκιμάσω αύριο να το τοποθετήσω και θα ενημερώσω.

 

Χίλια ευχαριστώ για την αναλυτική απάντηση παπι!

Δημοσ.

Είσαι σίγουρος ότι είναι compile λάθος ή μήπως είναι linking λάθος; 

 

Εάν είναι το 2ο, τότε (και διαβάζοντας όσα σου έγραψε ο παπι) με το να προσθέσεις το lib στο project θα είσαι ΟΚ. 

Δημοσ.

Πρόσθεσα το 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
Δημοσ.
  Στις 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
σου λειτουργεί ?
Δημοσ.

Όχι πάλι τα ίδια βγάζει.

Επίσης το ίδιο έρρορ βγάζει αν φτιάξω το αντικείμενο πρόγραμμα του main.c και στην συνέχεια το συνδέσω με την βιβλιοθήκη libole.a

Δημοσ.

Αν τρέξω"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

Δημοσ.

Δηλαδή τα objects μέσα στο archive είναι για windows ?

 

Τρέξε το εξής:

cd /tmp
mkdir aa
cd aa
ar x /home/bill/lib/libole.a
file *.o
και γράψε μας το αποτέλεσμα για ένα από όλα τα object files
Δημοσ.

Ορίστε: genlib.o: 80386 COFF executable not stripped - version 30821

(Όπως είπα χρησιμοποιώντας κατευθείαν τα objects αντί της βιβλιοθήκης παίρνω πάλι τα ίδια errors)

Δημοσ.

Αν και δεν διάβασα το pdf, εφόσον το wxdevc++ δεν τρέχει πουθενά εκτός από Windows, είναι πιστεύω ασφαλές να υποθέσουμε πως τα libraries που σας έχουν δώσει έχουν γίνει compile σε Windows. Πιθανότατα λοιπόν αυτό ακριβώς είναι και το πρόβλημά σου (λογικά με κάποια έκδοση του mingw).

 

Ζήτησε να δώσουν τον πηγαίο κώδικα της βιβλιοθήκης ώστε να την κάνεις compile μόνος σου, ή ζήτα τους να σου δώσουν τα object files για το λειτουργικό σου σύστημα (για σιγουριά με την ίδια έκδοση του compiler που έχεις κι εσύ).

 

Ή δοκίμασε σε προσομοιωμένο περιβάλλον Windows, π.χ. με Wine, να δουλέψεις απευθείας με το wx-devc++.

  • Like 1
Δημοσ.
  Στις 11/10/2013 στις 4:29 ΜΜ, bilakos10 είπε

Ορίστε: genlib.o: 80386 COFF executable not stripped - version 30821

Ναι. Τα αρχεία σου δεν προορίζονται να τρέξουν σε linux για αυτό και δεν βρίσκει τίποτα ο linker. Ή θα πρέπει να δουλέψεις σε Windows ή θα πρέπει να δώσουν τον κώδικα της βιβλιοθήκης και να τον κάνεις compile εσύ όπως πρότεινε και ο migf1.

Δημοσ.

Σας ευχαριστώ πολύ παιδιά και τους 2 σας για τον χρόνο που αφιερώσατε!

Θα επικοινωνήσω με το πανεπιστήμιο και θα σας ενημερώσω όταν βγάλω άκρη!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...