jimbakl Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 Καλησπέρα σας. Έχω ένα project στην C με κάμποσες συναρτήσεις, και καθώς το κάνω compile μου βγάζει αυτά τα σφάλματα: > Error 3 error LNK1120: 2 unresolved externals C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Debug\Column Generator.exe 1 Error 2 error LNK2019: unresolved external symbol "double * * __cdecl callocDouble2d(int,int)" (?callocDouble2d@@YAPAPANHH@Z) referenced in function _main C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Column Generator\main.obj Error 1 error LNK2019: unresolved external symbol "void __cdecl RevisedSimplexMethod(double *,double * *,double *,double *,int *,double *,double,int,int)" (?RevisedSimplexMethod@@YAXPANPAPAN00PAH0NHH@Z) referenced in function _main C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Column Generator\main.obj Σημειωτέον την main thn έχω ως main.cpp γιατί αν την βάλω main.c βγάζει ένα 1000000 λάθη που δεν έχουν λογική, πχ.. ότι σχεδόν όλα είναι undeclared ενώ είναι όλα οκ... Αυτό το πράγμα δεν έχω καταφέρει ποτέ να το διορθώσω γι αυτό το κάνω σε .cpp αλλά αυτή την φορά μου έβγαλε αυτά τα μηνυματα... Δεν ξέρω αν βοηθάει, αλλά να σας πώ ότι έχω και αρκετά header files στα οποία αποθηκεύω τα ορίσματα των συναρτήσεων, και το σώμα τους σε .c καμία βοήθεια;;;;;; το μόνο που βρήκα είναι να κάνω κάτι με το extend"C"{} αλλά 1ο) δεν το καταλαβαίνω και 2ον) μου βγάζει σφάλμα syntax error 'string' καμία βοήθεια;;;;
V.I.Smirnov Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 Aν κάποια αρχεία έχουν σήμανση *.c και κάποια άλλα *.cpp έχεις ένα πρόγραμμα με ανάμικτο κώδικα της C και της C++. Η σύνταξη των C και C++ έχει κάποιες διαφορές, όπερ σημαίνει ότι τα αρχεία τους δεν μπορούν να αναμιχθούν άμεσα. Μια από αυτές είναι ο τρόπος που αναφέρονται τα ονόματα των συναρτήσεων στον παραγόμενο οbject code (αρχεία *.obj): στην περίπτωση της C++ τίθεται μπροστά από κάθε όνομα το πρόθεμα "__" (γι αυτό και εν προκειμένω δεν τα βρίσκει). Σε αυτές τις περιπτώσεις χρησιμοποιείται το keyword extend"C" για να υποδείξει στον compiler να εφαρμόσει τις κατάλληλες σημάνσεις ώστε να καταστεί δυνατή η σύνδεση (κλήση C κώδικα από C++). Το κάθε αρχείο βέβαια πρέπει να μην έχει άλλα συντακτικά λάθη αλλιώς δεν θα δουλέψει. Βεβαιώσου ότι τα επιμέρους αρχεία που χρησιμοποιείς είναι σωστά γραμμένα και - αν επιμένεις στην ανάμιξη του κώδικα - δες πώς δουλεύει το extern"C". Όσο για τα μηνύματα "undecrared" κλπ που λαμβάνεις όταν έχεις την κατάληξη του αρχείου σε c, έχε κατά νου αυτό : ενώ στην C++ οι δηλώσεις μεταβλητών μπορούν να είναι οπουδήποτε βολεύει, στην C πρέπει να γίνονται μόνον στην αρχή του προγράμματος (άλλη μια διαφορά τους). Πω πω τι βλέπω...αναθεωρημένη μέθοδος Simplex... Τα έπαιζα στα δάχτυλά μου αυτά κάποτε... -
jimbakl Δημοσ. 2 Μαΐου 2012 Μέλος Δημοσ. 2 Μαΐου 2012 Οι συναρτήσεις είναι όλες σωστές και δοκιμασμένες... Εσυ δηλαδή μου λές μπροστά από το όνομα της συνάρτησης να βάλω το "_" πχ void _myfunction() και στο κάλεσμα??? πάλι _myfunction ??? Δεν θα θελα να το κάνω όμως έτσι... Αυτό που με μπερδεύει πιο πολύ από όλα είναι ότι στην main, όταν την έχω se *.c γίνεται χαμός από τα λάθη. > int i,j,nrow, ncol,k; double TC=0; FILE*fp=fopen("rsm_data.txt","r"); fscanf(fp,"%d %d",&nrow,&ncol); int *idxB=(int *)calloc(nrow,sizeof(int)); double **A=callocDouble2d(nrow,ncol); double *c=(double*)calloc(ncol,sizeof(double)); και ενώ όλα αυτά είναι σωστά μου λέει παρακάτω ότι καμία μεταβλητή μου δεν είναι δηλωμένη. ??????????? Εγώ κυρίως αυτό θέλω να μάθω πως να το διορθώνω..... Ο τρόπος που βρήκα χτές ήταν ονομάζοντας το αρχείο από *.c se *.cpp έτσι λέει ο compiler γίνεται πιο "χαλαρός" kai δεν χτυπάει...
V.I.Smirnov Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 To προθεμα "__" τίθεται ή όχι αυτόματα και αφανώς στον αντικειμενικό κώδικα, ανάλογα με το αν είναι C ή C++. Eσύ δεν κάνεις απολύτως τίποτε. Το extern"C" δείχνει στον compiler οτι κώδικας που θα επεξεργαστεί είναι σε μορφή "C" και επομένως ο compiler χρησιμοποιεί την κατάλληλη σύμβαση προκειμένου να δει τα αρχεία. Αυτό που κάνεις για να διορθώσεις τις δηλώσεις είναι λάθος. Αλλάζοντας το *.c σε *.cpp υποδεικνύεις στον compiler ότι ο κώδικας είναι C++ και συνεπώς για τις δηλώσεις των μεταβλητών (και όλα τα άλλα βεβαίως) ακολουθεί τις συμβάσεις της C++. Δεν γίνεται πιο χαλαρός ο κώδικας, καμιά σχέση. Αυτή την στιγμή δυστυχώς δεν μπορώ να σε βοηθήσω περισσότερο. Ψάξε τα παραπάνω ή ας σε βοηθήσει κάποιος που είναι διαθέσιμος... -
Typhoon Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 Κάντα όλα C ή C++ και αν τρέχει VS που από ότι βλέπω τρέχει, πήγαινε στα project properties και ρύθμισε των compiler κατάλληλα. Επίσης φρόντισε τυχών βιβλιοθήκες που χρησιμοποιείς να είναι η κατάλληλες (πχ αν γράψεις C time.h, αν γράψεις C++ ctime).
nilosgr Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 Δεν κανεις σωστα linking τα αρχεια σου, πχ αν χρησημοποιεις πανω απο ενα αρχειο πηγαιου κωδικα πρεπει για καθε αρχειο .cpp που δεν εχει main() να κανεις το αντιστοιχο .h που θα εχει τα prototypes των συναρτησεων και θα κανεις #include αυτο κι οχι το .cpp πχ main.cpp >#include "my.h" int main() { return foo(); } my.h >#ifndef _MY_H_ #define _MY_H_ int foo(); #endif my.cpp >#include "my.h" int foo() { return 12; }
V.I.Smirnov Δημοσ. 2 Μαΐου 2012 Δημοσ. 2 Μαΐου 2012 Αυτό που με μπερδεύει πιο πολύ από όλα είναι ότι στην main, όταν την έχω se *.c γίνεται χαμός από τα λάθη. > int i,j,nrow, ncol,k; double TC=0; FILE*fp=fopen("rsm_data.txt","r"); fscanf(fp,"%d %d",&nrow,&ncol); int *idxB=(int *)calloc(nrow,sizeof(int)); double **A=callocDouble2d(nrow,ncol); double *c=(double*)calloc(ncol,sizeof(double)); και ενώ όλα αυτά είναι σωστά μου λέει παρακάτω ότι καμία μεταβλητή μου δεν είναι δηλωμένη. ??????????? Σωστά σου λέει ότι δεν έχεις δηλώσει τις μεταβλητές. Τα παραπάνω δεν είναι δήλωση (declaration) αλλά ορισμός (definition). Υπάρχει διαφορά στις δυο έννοιες : ο ορισμός μεταβλητής δεσμεύει χώρο στην μνήμη και μπορεί να την αρχικοποιεί. η δήλωση δείχνει απλώς ότι κάπου παρακάτω θα χρησιμοποιεθεί η συγκεκριμένη μεταβλητή. Στην C++ η δήλωση είναι ταυτόχρονα και ορισμός. Στην C, όχι. Αυτό που κάνεις εδώ (αφού προκειται για C) είναι σα να προσπαθείς να χρησιμοποιείς τις μεταβλητές δίχως να τις δηλώσεις, γι αυτό "χτυπάει" ο κώδικας. Σου το είπα ήδη στο post #2 : στην C, πρώτα τα δηλώνεις όλα και μετά τα χρησιμοποιείς. -
migf1 Δημοσ. 3 Μαΐου 2012 Δημοσ. 3 Μαΐου 2012 .. Σου το είπα ήδη στο post #2 : στην C, πρώτα τα δηλώνεις όλα και μετά τα χρησιμοποιείς. ... Αυτό έχει πάψει να ισχύει από την αναθεώρηση C99. Μπορείς και δηλώνεις σε οποιαδήποτε γραμμή θέλεις στο τρέχον μπλοκ. Αλλά η Microsoft έχει παρατημένη την C στην αναθεώρηση C89/C90. @jimblaki: Εφόσον ασχολείσαι μονάχα με C. σκέψου πολύ σοβαρά να εγκαταλείψεις το VS. Δες την Pelles-C (πρόσφατα έβγαλε νέα έκδοση με υποστήριξη της αναθεώρησης C11) ή κάποιο από τα πολλά IDE για τον mingw gcc. Επίσης, δεν είναι καθόλου καλή ιδέα να αναμειγνύεις κώδικα C με C++ χωρίς να ξέρεις απολύτως πως και γιατί το κάνεις.
παπι Δημοσ. 3 Μαΐου 2012 Δημοσ. 3 Μαΐου 2012 Τον τρελανες τον compiler Το προβλημα το εχεις στο linkage. Η λυση ειναι να βαλεις extern "C". Προσοχη, η c δεν εχει αυτο το keyword, για αυτο θα παιξεις με το preprocessor πχ ενα παραδειγμα *.h > #ifdef __cplusplus extern "C" { #endif void test(); void test1(); voidtestN(); #ifdef __cplusplus } #endif
moukoublen Δημοσ. 3 Μαΐου 2012 Δημοσ. 3 Μαΐου 2012 Εφόσον ασχολείσαι μονάχα με C. σκέψου πολύ σοβαρά να εγκαταλείψεις το VS. Δες την Pelles-C (πρόσφατα έβγαλε νέα έκδοση με υποστήριξη της αναθεώρησης C11) ή κάποιο από τα πολλά IDE για τον mingw gcc. Συμφωνώ και επαυξάνω. Κατέβασε Pelles-C που είναι εξαιρετικό και σαν περιβάλλον και σαν compiler και γράφε εκεί ότι θες (απ τη στιγμή πάντα που μιλάμε μονο για C). Είναι κρίμα να χάνεις τόσο χρόνο και να μπουρδουκλώνεις τόσο πολύ τα πράγματα. ... Σημειωτέον την main thn έχω ως main.cpp ... Συμπληρώνω. Το visual studio είναι παρα πολύ καλο γενικά, δε λέω. Και η microsoft c++ δεν έχει αρνητικά σχόλια. Εξαρτάται πάντα τι θες να κανεις. Από κει και πέρα αφού μιλάμε για καθαρή C το visual studio και ο C compiler τις microsoft δεν κάνει*. Αν έχεις προγραμματίσει γενικά σε visual studio μονο είναι πιθανό να σου δημιουργείται μια ανασφάλεια να πας αλλου. Αλλα κανε τον κόπο. Αλλιώς θα χάνεις χρόνο και θα μπουρδουκλώνεις τόσο πολύ τον κώδικα σου. *Διότι βασικά όπως είπε και ο migf1 η microsoft έχει σταματήσει να υποστηρίζει την C (που δίνει για εμπορικούς σκοπούς τουλάχιστον). Γενικά δείχνει να μην την ενδιαφέρει και τόσο η C. Έχει βεβαια τόσες άλλες πλατφόρμες που υποστηρίζει οποτε λογικό.
Timonkaipumpa Δημοσ. 4 Μαΐου 2012 Δημοσ. 4 Μαΐου 2012 Όπως ήδη είπανε οι συνφορουμίτες, το λάθος είναι το linking. Ο linker δεν μπορεί να βρει τις συναρτήσεις που ορίζονται από τα symbols που σου λέει (π.χ. η συνάρτηση callocDouble2d(int,int)) έτσι ώστε να συνδέσει τα κομμάτια κώδικα. Δε νομίζω ότι η λύση είναι η χρήση C++ αρχείων ή/και compiler. Εάν ο κώδικας σου είναι C, γράψε C. Χώρια που μερικοί βολικοί τύποι δεν "περνάνε" σε C++ παρά μόνο σε C (ούτε με extern "C" δήλωση για τον compiler). Το πρόβλημα που έχεις με το linking, εάν υπάρχει και με την "χρήση" C, εικάζω πως είναι στο πως χειρίζεσαι τα includes σου.
nilosgr Δημοσ. 4 Μαΐου 2012 Δημοσ. 4 Μαΐου 2012 συμφωνω με τον Timonkaipumpa, το εχω αντιμετοπισει κι εγω αυτο το προβλημα και το ελυσα με τον τροπο που σου ειπα παραπανω
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα