2013-06-15 17 views
19

Próbuję utworzyć program z wieloma plikami po raz pierwszy. Nigdy nie miałem problemu z kompilowaniem programu tylko z main.cpp. z następujących poleceń, jest to wynik:Wyjście g ++: plik nie został rozpoznany: nie rozpoznano formatu pliku

$ g++ -c src/CNumber.cpp src/CNumber.h -o src/CNumber.o 
$ g++ -c src/CExprPart.cpp src/CExprPart.h -o src/CExprPart.o 
$ g++ -c src/CExpr.cpp src/CExpr.h -o src/CExpr.o 
$ g++ -c src/main.cpp -o src/main.o 
$ g++ src/CNumber.o src/CExprPart.o src/CExpr.o src/main.o -o execprogram 
src/CNumber.o: file not recognized: File format not recognized 
collect2: error: ld returned 1 exit status 

Co może być przyczyną takiego błędu i co mam z nim zrobić? Używanie systemu Linux Mint z gcc (Ubuntu/Linaro 4.7.2-2ubuntu1). Dziękuję

+1

To trochę dziwne, jeśli chodzi o pliki nagłówkowe w liniach poleceń kompilacji. –

+1

Masz rację, to jest problem. Dziękuję Ci. – RuinerCZ

Odpowiedz

19

Tak jest źle:

g++ -c src/CNumber.cpp src/CNumber.h -o src/CNumber.o 

Nie powinny "opracować" pliki .h. Spowoduje to utworzenie skompilowanych plików nagłówkowych, które nie są używane do utworzenia pliku wykonywalnego. Powyższe powinno być po prostu

g++ -c src/CNumber.cpp -o src/CNumber.o 

Podobny do sporządzania innych plików .cpp

+0

Tak więc, o ile rozumiem, builder jest w stanie znaleźć te pliki nagłówkowe samodzielnie z powodu dyrektyw #include, prawda? – RuinerCZ

+0

@ user2489350 Tak. W zależności od tego, gdzie się znajdują. Możesz określić dodatkowe ścieżki do wyszukiwania plików #include z argumentem -I do gcc/g ++ – nos

-2

spróbować umieścić wszystkie z następujących plików w jednym katalogu:

example.cpp:

#include<iostream> 
#include<string> 

#include "my_functions.h" 

using namespace std; 

int main() 
{ 
    cout << getGreeting() << "\n"; 

    return 0; 
} 

my_functions.cpp:

#include<string> 
using namespace std; 

string getGreeting() 
{ 
    return "Hello world"; 
} 

my_functions.h:

#ifndef _MY_FUNCTIONS_H 
#define _MY_FUNCTIONS_H 

#include<string> 
using namespace std; 

string getGreeting(); 

#endif 

Następnie wykonaj następujące polecenia:

$ g++ example.cpp my_functions.cpp -o myprogram 
~/c++_programs$ ./myprogram 
Hello world 
+0

Dzięki za odpowiedź. Buduje się dobrze. Jeśli użyję just ./myprogram zamiast drugiej linii, otrzymam poprawny wynik (hello world) – RuinerCZ

17

wpadłem na ten błąd w coś budowania - okazało się, że z powodu braku poprzedniej kompilacji podczas kompilacji pliku źródłowego do pliku .o - ten plik .o był niekompletny lub uszkodzony, więc gdy spróbowałem innej kompilacji, ten błąd pojawił się w tym pliku. Rozwiązaniem było właśnie usunięcie pliku .o (lub uruchomienie make clean, jeśli masz plik Makefile z tym celem).

(Nie ma to wiele wspólnego z pierwotnym problemem z postem, ale było to jedno z pierwszych trafień w wyszukiwarce Google z powodu błędu, więc po prostu dodaj go tutaj).

+1

Tak właśnie mi się stało – user3405291

+2

Rozwiązałem również mój problem. –

Powiązane problemy