Использование G ++ для компиляции нескольких файлов .cpp и .h


172

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

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

Ответы:


224

перечислите все остальные файлы cpp после main.cpp.

т.е.

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

и так далее.

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


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

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

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

@gabriel_vincent Для начала не нужно писать make-файлы вручную. Вместо этого используйте правильную систему сборки, такую ​​как CMake.
Баум мит Ауген

3
@BaummitAugen Да, за исключением того, что я просто хочу скомпилировать эту крошечную 2-файловую программу, которую я написал за 14 минут, и я действительно предпочел бы потратить 1 минуту на написание make-файла, а не час на настройку cmake.
Przemek D

55

Чтобы скомпилировать отдельно без ссылок, вам нужно добавить -cопцию:

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

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

22

Теперь, когда я разделил классы на файлы .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 также правильно перестраивал то, что нужно перестраивать из-за изменений файла заголовка.


13

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

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

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


12

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

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

вот и все!!

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

ps Используйте этот метод, только если вам не нужен make-файл.


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

11

.h файлы не имеют ничего общего с компиляцией ... вам нужны только файлы cpp ... g++ filename1.cpp filename2.cpp main.cpp -o myprogram

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

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


7

Как сказал rebenvp, я использовал:

g++ *.cpp -o output

А затем сделайте это для вывода:

./output

Но лучшим решением является использование makeфайла. Читайте здесь, чтобы узнать больше о makeфайлах.

Также убедитесь, что вы добавили необходимые .hфайлы в .cppфайлы.


4

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


2

Если вы хотите использовать #include <myheader.hpp>внутри своих файлов cpp, вы можете использовать:

g++ *.cpp -I. -o out

1

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

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


-4

~ / In_ProjectDirectory $ g ++ordin_main.cpp Coord_func.cpp Coord.h

~ / In_ProjectDirectory $ ./a.out

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

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

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


3
Вы получаете отрицание, потому что вы включили h-файлы, что является ошибкой.
Эрик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.