2010-07-08 2 views
97

Я только что унаследовал некоторый код на C++, который был написан плохо с одним файлом cpp, в котором содержались основные и несколько других функций. Также есть файлы .h, которые содержат классы и определения их функций.Использование G ++ для компиляции нескольких файлов .cpp и .h

До сих пор программа была скомпилирована с использованием команды g++ main.cpp. Теперь, когда я разделил классы на .h и .cpp файлы, мне нужно использовать make-файл, или я могу использовать команду g++ main.cpp?

ответ

135

список всех других файлов cpp после main.cpp.

т.е.

g++ main.cpp other.cpp etc.cpp 

и так далее.

Или вы можете скомпилировать их все индивидуально. Затем вы связываете все полученные «.o» файлы вместе.

+89

Вы даже можете сделать 'g ++ * .cpp -o output' – rubenvb

+6

Это так или иначе плохая практика? Я хотел бы использовать это в своем make-файле. –

+6

@gabriel_vincent, это не обязательно плохая практика, но это будет означать, что редактирование одного файла в проекте из сотен заставит компилятор переделать всю работу для всех файлов. Компиляция отдельно позволяет инкрементную компиляцию. –

7

Вы можете использовать г ++ напрямую, если вы хотите:

g++ f1.cpp f2.cpp main.cpp 

где f1.cpp и f2.cpp являются файлы с функциями в них. Подробнее о том, как использовать make для сборки, см. В отличном GNU make documentation.

3

Вы можете использовать несколько команд g ++, а затем ссылку, но проще всего использовать традиционный Makefile или какую-либо другую систему сборки: например, Scons (которые часто легче настраивать, чем Make-файлы).

16

Теперь, когда я разделял классы на файлы .h и .cpp, мне нужно использовать make-файл или я могу использовать команду g ++ main.cpp?

Сборка нескольких файлов сразу является плохим выбором, если вы собираетесь поместить это в Makefile.

Обычно в Makefile (для GNU/Make), то должно быть достаточно, чтобы написать, что:

# "all" is name of the default target, running "make" without params would use it 
all: executable1 

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker 
CC=$(CXX) 

# tell which files should be used, .cpp -> .o make would do automatically 
executable1: file1.o file2.o 

Таким образом make будет правильно перекомпиляции только то, что нужно перекомпилировать. Можно также добавить несколько настроек для генерации зависимостей заголовков файлов - так что make также правильно перестроит то, что нужно перестроить из-за изменений файла заголовка.

2

.h файлы не будут ничего делать с компиляции ... вы заботитесь только о CPP файлы ... так типа г ++ filename1.cpp filename2.cpp main.cpp -o MyProgram

означает, что вы компиляции каждого CPP файлы, а затем связали их вместе в myprgram.

затем запустить программу ./myprogram

0

я использовал, чтобы использовать пользовательский файл сборки, скомпилированные все файлы в текущем каталоге, но мне пришлось скопировать его в каждой директории я нуждался, каждый раз.

Итак, я создал свой собственный инструмент - Universal Compiler, который упростил процесс при компиляции многих файлов.

28

Для компиляции отдельно без привязки необходимо добавить опцию -c:

g++ -c myclass.cpp 
    g++ -c main.cpp 
    g++ myclass.o main.o 
    ./a.out 
+0

Обратите внимание, что если вы хотите управлять именем исполняемого файла на этапе компоновки, просто выполняйте то, что вы обычно делаете: 'g ++ -o my_executable myclass.o main.o' – neuronet

3

Я знаю, что этот вопрос был задан лет назад, но все еще хотел поделиться тем, как я обычно скомпилировать несколько C++ файлов.

  1. Допустим, у вас есть 5 CPP файлы, все, что вам нужно сделать, это использовать * вместо того, чтобы вводить каждый CPP файлы имя например г ++ -c * .cpp -o MyProgram.
  2. Это создаст "MyProgram"
  3. запустить программу ./myprogram

вот и все !!

Причина, по которой я использую *, состоит в том, что если у вас есть 30 файлов cpp, вы бы набрали все из них? или просто используйте знак * и сэкономьте время :)

p.s Используйте этот метод, только если вам не нужен makefile.

+0

Ошибка переопределения возникает, когда я использую этот подход? Есть ли другой способ сделать то же самое? –

-3

~/In_ProjectDirectory $ г ++ coordin_main.cpp coordin_func.cpp coordin.h

~/In_ProjectDirectory $ ./a.out

... Работали !!

Использование Linux Mint с Geany IDE

Когда я сэкономил каждый файл в том же каталоге, один файл не был сохранен правильно в каталоге; файл Coordin.h. Итак, перепроверенный и он был сохранен там как Coordin.h, а не неправильно как -> coordin.h.gch. Маленький материал. Arg !!

+0

Вы получаете downvoted, потому что вы включили h-файлы, что является ошибкой. – neuronet

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