Birden çok .cpp ve .h dosyasını derlemek için G ++ kullanma


172

Ben sadece ana ve diğer fonksiyonların bir demet içeren bir cpp dosyası ile kötü yazılmış bazı C ++ kodu miras. .hSınıfları ve işlev tanımlarını içeren dosyalar da vardır .

Şimdiye kadar program komut kullanılarak derlendi g++ main.cpp. Şimdi sınıfları ayırdım .hve .cppdosyaları bir makefile kullanmam gerekir g++ main.cppmi yoksa hala komutu kullanabilir miyim ?

Yanıtlar:


224

main.cpp'den sonra diğer tüm cpp dosyalarını listeler.

yani

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

ve bunun gibi.

Veya hepsini tek tek derleyebilirsiniz. Ardından, ortaya çıkan tüm ".o" dosyalarını birbirine bağlarsınız.


152
Hatta yapabilirsing++ *.cpp -o output
— rubenvb

7
Bu zaten kötü bir uygulama mı? Bunu makyaj dosyamda kullanmak istiyorum.
— gabriel_vincent

8
@gabriel_vincent, kötü bir uygulama olmak zorunda değildir, ancak yüzlerce projede bir dosyayı düzenlemek, derleyicinin tüm dosyalar için tüm işi yeniden yapmasına neden olacaktır. Ayrı olarak derlemek artımlı derlemeye izin verir.
— Paul Draper

@gabriel_vincent Başlamak için elle tefekkür yazmamalısınız. Bunun yerine CMake gibi uygun bir yapı sistemi kullanın.
— Baum mit Augen

3
@BaummitAugen Evet, sadece 14 dakika içinde yazdığım bu küçük 2 dosyalı programı derlemek istiyorum ve cmake kurmak yerine bir saat yazmak için gerçekten 1 dakika harcamak istiyorum.
— Przemek D

55

Bağlamadan ayrı olarak derlemek için -cseçenek eklemeniz gerekir :

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

3
Bağlama adımında yürütülebilir dosyanın adını kontrol etmek istiyorsanız, sadece genellikle ne yaptığınızı not edin:g++ -o my_executable myclass.o main.o
— eric

22

Şimdi sınıfları .h ve .cpp dosyalarına ayırdım, bir makefile kullanmam gerekiyor mu yoksa hala "g ++ main.cpp" komutunu kullanabilir miyim?

Eğer Makefile içine koyacaksanız, aynı anda birkaç dosya derlemek kötü bir seçimdir.

Normalde bir Makefile'de ( GNU / Make için ) şunu yazmak yeterli olmalıdır:

# "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

Bu şekilde makeyalnızca yeniden derlenmesi gerekenleri düzgün bir şekilde derlemek gerekir. Ayrıca üstbilgi dosya bağımlılıkları oluşturmak için birkaç tweaks eklenebilir - böylece make da üstbilgi dosyası değişiklikleri nedeniyle yeniden oluşturulması gerekenleri düzgün bir şekilde yeniden inşa edecek.


13

İsterseniz doğrudan g ++ kullanabilirsiniz:

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

burada f1.cpp ve f2.cpp, içinde işlevleri olan dosyalardır. Oluşturma işlemini yapmak için nasıl kullanacağınıza ilişkin ayrıntılar için, mükemmel GNU marka oluşturma belgelerine bakın .


12

Bu sorunun yıllar önce sorulduğunu biliyorum ama yine de genellikle birden fazla c ++ dosyasını nasıl derlediğimi paylaşmak istedim.

  1. Diyelim ki 5 cpp dosyanız var, tek yapmanız gereken her cpp dosyası adını yazmak yerine * kullanmaktır g++ -c *.cpp -o myprogram.
  2. Bu, "myprogram"
  3. Programı çalıştır ./myprogram

bu kadar!!

* Kullanmamın nedeni, 30 cpp dosyanız varsa hepsini yazmanızdır. ya da sadece * işaretini kullanın ve zaman kazanın :)

ps Bu yöntemi yalnızca makefile ile ilgilenmiyorsanız kullanın.


1
Bu yaklaşımı kullandığımda yeniden tanımlama hatası oluşuyor? Aynı şeyi yapmanın başka bir yolu var mı?
— Waseem Ahmad Naeem

11

.h dosyaları derleme ile ilgisi yoktur ... sadece cpp dosyalarını önemsiyorsun ... yani yazın g++ filename1.cpp filename2.cpp main.cpp -o myprogram

her bir cpp dosyasını derleyip bunları birbirine bağladığınız anlamına gelir myprgram.

sonra programını çalıştır ./myprogram


7

Rebenvp'in dediği gibi kullandım:

g++ *.cpp -o output

Ve sonra bunu çıktı için yapın:

./output

Ancak daha iyi bir çözüm makedosya kullanmaktır . Dosyalar hakkında daha fazla bilgi için burayı okuyun make.

Ayrıca, gerekli .hdosyaları dosyalara eklediğinizden emin olun .cpp.


4

Birkaç g ++ komutunu ve ardından bağlantıyı kullanabilirsiniz, ancak en kolayı geleneksel bir Makefile veya başka bir derleme sistemi kullanmaktır: Scons gibi (genellikle Makefiles'den daha kolay kurulur).


2

Eğer #include <myheader.hpp>cpp dosyalarınızın içinde kullanmak isterseniz şunları kullanabilirsiniz:

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

1

Geçerli dizindeki tüm dosyaları derleyen özel bir Makefile kullanıyordum, ancak her ihtiyaç duyduğum her dizine kopyalamak zorunda kaldım.

Bu yüzden kendi aracımı yarattım - birçok dosyayı derlerken süreci çok daha kolaylaştıran Universal Derleyici .


-4

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

~ / In_ProjectDirectory $ ./a.out

... Çalıştı !!

Linux Mint'i Geany IDE ile kullanma

Her dosyayı aynı dizine kaydettiğimde, bir dosya dizine doğru şekilde kaydedilmedi; coordin.h dosyası. Böylece, yeniden kontrol edildi ve orada coordin.h olarak kaydedildi ve yanlış olarak -> coordin.h.gch olarak kaydedilmedi. Küçük şeyler. Arg !!


3
Bir hata olan h-dosyalarını eklediğiniz için indirildiniz.
— eric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.