2013-06-10 16 views
6

Sì, è stato chiesto prima, ma ogni risposta che ho trovato su SO e altrove ha a che fare con la compilazione del codice C++ in gcc invece di g ++, o un problema di un po 'con le librerie standard. Fino ad ora, nulla in realtà è allineato giusto per me qui.gcc 4.2.1 Problema di collegamento: Simboli indefiniti per l'architettura x86_64

Quindi, sto seguendo un corso base di crash su C, e sto cercando di compilare un esempio usato per illustrare il collegamento ai file che create, piuttosto che alle librerie standard. Ecco il codice:

math_functions.h

int sum  (int x, int y); 
float average (float x, float y, float z); 

math_functions.c

int sum (int x, int y) 
{ 
    return (x + y); 
} 

float average (float x, float y, float z) 
{ 
    return (x + y + z)/3; 
} 

e infine

test3.c

#include <stdio.h> 
#include "math_functions.h" 

main() 
{ 
    int theSum  = sum (8, 12); 
    float theAverage = average (16.9, 7.86, 3.4); 

    printf ("the sum is: %i ", theSum); 
    printf ("and the average is: %f \n", theAverage); 
    printf ("average casted to an int is: %i \n", (int)theAverage); 
} 

Questi sono tutti nella stessa cartella. Quando apro il terminale, cd nella cartella ed eseguire:

gcc test3.c -o test3 

ottengo:

Undefined symbols for architecture x86_64: 
    "_average", referenced from: 
    _main in ccmf69Tt.o 
    "_sum", referenced from: 
    _main in ccxms0fF.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Questo accade se uso gcc o g ++ (che non avrei dovuto fare, dal momento che questo dovrebbero essere tutti C), e tutto ciò che ho compilato prima d'ora funziona bene con il

#include <stdio.h> 

in alto.

posso farlo per compilare ed eseguire bene per la rimozione del

#include "math_functions.h" 

dal test3.c file di , mettendo il contenuto di math_functions.h prima di main() e il contenuto di math_functions.c dopo main(). E sì, quello è copia e incolla, quindi è sicuramente lo stesso codice.

Quindi sì, riesco a far funzionare il mio codice, ma sconfigge lo scopo dell'esercizio, nel senso che non riesco a utilizzare quel codice in nessun altro file C senza copiarlo e incollarlo in l'unico file ...

Quindi mi chiedo, c'è un modo per risolvere questo problema, quindi posso includere più che solo le librerie standard C, C++ e Objective-C?

Questo succede attraverso la casella Terminale, digitando manualmente il comando gcc, e tramite CodeRunner, che ha tutti i comandi standard nascosti in un pulsante, quindi non posso riempirlo.

Sto eseguendo Mountain Lion 10.8.4 (12E55) su un Mac Mini 2012, utilizzando gli strumenti da riga di comando di Xcode 4.6.2 (li ho installati solo poche ore fa, in realtà non ho fatto molto rispetto allo standard utilizzo della Mini fino ad ora)

Ho installato lo stesso software sul mio MacBook Air, ma non l'ho provato per vedere se lo stesso va ancora giù.

Eventuali suggerimenti? Se qualcun altro ha avuto questo e l'ha risolto da qualche parte qui su SO, per favore indicatelo, ho cercato per circa un'ora, ma come ho detto prima, tutte le soluzioni che ho trovato fin qui finiscono quando è un codice C++ o qualcosa di strano con le librerie standard.

risposta

5

Hai solo bisogno di compilare la funzione maths_function. Il linker si lamenta che non ha le definizioni contenute in quel modulo.

gcc test3.c math_functions.c -o test3 
+0

Ah, sarebbe stato utile avere nel libro ... sebbene guardando avanti, gli esempi futuri sembrano avere questa sintassi. Il sito dell'autore ha una sezione per le correzioni, quindi vado a verificare se è lì, e se no, mandalo via email. Grazie! – FreelancerJ

Problemi correlati