2013-06-15 2 views
19

Я пытаюсь создать программу с несколькими файлами в первый раз. У меня никогда не возникало проблем с программой для комплимента только с main.cpp. С помощью следующих команд, это результат:g ++ output: файл не распознан: формат файла не распознан

$ 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 

Что может вызвать такую ​​ошибку и что мне с ним делать? Использование Linux Mint с gcc (Ubuntu/Linaro 4.7.2-2ubuntu1). Спасибо

+1

Немного странно включать заголовочные файлы в командные строки компиляции. –

+1

Вы правы, это проблема. Спасибо. – RuinerCZ

ответ

19

Это неправильно:

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

Вы не должны "собрать" .h файлы. При этом создаются предварительно скомпилированные файлы заголовков, которые не используются для создания исполняемого файла. выше должен быть просто

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

Похожими для составления других .cpp файлов

+0

Итак, насколько я понял, строитель может найти эти файлы заголовков сам по себе из-за директив #include, не так ли? – RuinerCZ

+0

@ user2489350 Да. В зависимости от того, где они расположены. Вы можете указать дополнительные пути для поиска #include файлов с аргументом -I в gcc/g ++ – nos

-2

Попробуйте положить все из следующих файлов в одном каталоге:

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 

Затем выполните следующие команды:

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

Спасибо за ответ. Он строит отлично. Если я использую только ./myprogram вместо вашей второй строки, я получаю правильный вывод (hello world) – RuinerCZ

17

Я столкнулся с этой ошибкой в ​​создании чего-то - оказалось, что из-за предыдущую сборку неудачи при компиляции исходного файла в файл .o - этот файл .o был неполным или поврежденным, поэтому, когда я попробовал другую сборку, он дал эту ошибку в этом файле. Решением было просто удалить файл .o (или запустить make clean, если у вас есть make-файл с этой целью).

(Это не имеет особого отношения к исходной проблеме с сообщением, но это был один из первых ударов в поиске Google ошибки, поэтому просто добавив его здесь).

+1

Вот что случилось со мной – user3405291

+2

Решил также мою проблему. –

Смежные вопросы