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.