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

#c #g

Вопрос:

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

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

Комментарии:

1. g *.cpp было бы достаточно скомпилировать все файлы cpp, так как порядок не имеет значения, пока мы еще не связываемся.

Ответ №1:

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

т.е.

 g   main.cpp other.cpp etc.cpp
 

и так далее.

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

Комментарии:

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

2. В любом случае, это плохая практика? Я хотел бы использовать это в своем файле makefile.

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

4. @gabriel_vincent Для начала вам не следует писать файлы makefile от руки. Вместо этого используйте правильную систему сборки, такую как CMake.

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

Ответ №2:

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

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

Комментарии:

1. Примечание Если вы хотите управлять именем исполняемого файла на этапе связывания, просто сделайте то, что вы обычно делаете: g -o my_executable myclass.o main.o

2. почему бы просто не использовать g *.cpp ?

Ответ №3:

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

Компиляция нескольких файлов одновременно-плохой выбор, если вы собираетесь поместить их в файл Makefile.

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

 # "all" is the 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 также правильно перестроил то, что необходимо перестроить из-за изменений файла заголовка.

Ответ №4:

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

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

вот и все!!

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

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

Комментарии:

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

2. Для ошибки переопределения вам нужно использовать «включить охрану» #ifndef/#define/#endif . Или, если вы используете более современный компилятор, вы можете использовать #pragma once

3. Я использую g -10 и получаю fileNotFound ошибку, используя этот синтаксис подстановочных знаков, но если я включаю имена файлов (разделенные пробелами) с тем же путем к директории, это работает нормально… g -10 /abs/src/path/*.cpp -o /abs/src/path/binary_file вызывает ошибку g -10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file , но работает нормально…… Что это за безумие?

Ответ №5:

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

 g   f1.cpp f2.cpp main.cpp
 

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

Ответ №6:

.h файлы не будут иметь никакого отношения к компиляции … вас интересуют только файлы cpp… итак, наберите g filename1.cpp filename2.cpp main.cpp -o myprogram

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

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

Ответ №7:

Как сказал ребен, я использовал:

 g   *.cpp -o output
 

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

 ./output
 

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

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

Комментарии:

1. Я использую g -10 и получаю fileNotFound ошибку, используя этот синтаксис подстановочных знаков, но если я включаю имена файлов (разделенные пробелами) с тем же путем к директории, это работает нормально… g -10 /abs/src/path/*.cpp -o /abs/src/path/binary_file вызывает ошибку g -10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file , но работает нормально…… Что это за безумие?

Ответ №8:

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

Ответ №9:

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

 g   *.cpp -I. -o out
 

Комментарии:

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

Ответ №10:

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

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

Ответ №11:

при использовании компилятора в командной строке следует учитывать следующее: вам не нужно компилировать файл заголовка, так как файл заголовка подставляется в сценарий, в котором используется директива include. вам потребуется скомпилировать и связать реализацию и файл сценария. например, пусть корова.h быть заголовочным файлом и cow.cpp быть файлом реализации и cow.cc(файлы c могут иметь расширение .cpp, .cc, .cxx, .C, .CPP, .cp) быть файлом сценария. Поскольку обозначение компилятора gcc для файла c — g , мы можем скомпилировать и связать файлы с помощью

 $g   -g -Wall cow.cpp cow.cc -o cow.out
 

параметры «- g » и «- Wall » предназначены для отладочной информации и получения предупреждений об ошибках. Здесь cow.out-это имя исполняемого двоичного файла, который мы можем выполнить для запуска программы. всегда полезно дать имя исполняемому файлу, иначе имя будет дано автоматически, что иногда может привести к путанице.
вы также можете сделать то же самое с помощью makefiles, makefiles автоматически обнаружит, скомпилирует и свяжет указанные файлы.
Существуют большие ресурсы для компиляции с использованием командной строки
введите описание ссылки здесь

Ответ №12:

~/каталог_проектов $ g coordin_main.cpp coordin_func.cpp координация.ч

~/Директория in_project $ ./a.out

… Сработало!!

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

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

Комментарии:

1. Вы получаете пониженный голос, потому что вы включили h-файлы, что является ошибкой.