Використання G ++ для компіляції декількох .cpp та .h файлів


172

Я щойно успадкував якийсь код C ++, який був погано написаний одним файлом cpp, який містив головну та купу інших функцій. Також є .hфайли, які містять класи та визначення їх функцій.

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

Відповіді:


224

перерахуйте всі інші файли cpp після main.cpp.

тобто

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

і так далі.

Або ви можете скласти їх усі окремо. Потім ви зв'язуєте всі отримані файли ".o" разом.


152
Можна навіть зробитиg++ *.cpp -o output
rubenvb

7
Це все-таки погана практика? Я хотів би використати це у своєму makefile.
gabriel_vincent

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

@gabriel_vincent Для початку не слід писати файли вручну. Замість цього використовуйте належну систему складання, як-от CMake.
Baum mit Augen

3
@BaummitAugen Так, хіба що я просто хочу скласти цю крихітну 2-файльну програму, яку я написав за 14 хвилин, і я дійсно вважаю за краще витратити 1 хвилину на написання файлу замість години налаштування 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-файли, чи потрібно мені використовувати makefile чи можу я все-таки використовувати команду "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 Використовуйте цей метод лише в тому випадку, якщо вас не хвилює makefile.


1
Помилка повторного визначення виникає, коли я використовую цей підхід? Чи є інший спосіб зробити те ж саме?
Waseem Ahmad Naeem

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 ++ koordin_main.cpp координат_func.cpp координат.h

~ / In_ProjectDirectory $ ./a.out

... Працювали !!

Використання Linux Mint з Geany IDE

Коли я зберігав кожен файл в одному каталозі, один файл не був правильно збережений у каталозі; файл координат.h. Отже, повторно перевірено, і там було збережено як координат.h, а не неправильно як -> координат.h.gch. Маленька штучка. Аргумент !!


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