#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 .
- Допустим, у вас есть 5 файлов cpp, все, что вам нужно сделать, это использовать * вместо ввода имени каждого файла cpp, например
g -c *.cpp -o myprogram
. - Это приведет к созданию
"myprogram"
- запустите программу
./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-файлы, что является ошибкой.