Usando o G ++ para compilar vários arquivos .cpp e .h

172

Acabei de herdar um código C ++ que foi mal escrito com um arquivo cpp que continha as principais e várias outras funções. Também existem .harquivos que contêm classes e suas definições de função.

Até agora, o programa foi compilado usando o comando g++ main.cpp. Agora que separei as classes .he os .cpparquivos, preciso usar um makefile ou ainda posso usar o g++ main.cppcomando?

Meir
fonte

Respostas:

224

liste todos os outros arquivos cpp após main.cpp.

ie

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

e assim por diante.

Ou você pode compilá-los todos individualmente. Você então vincula todos os arquivos ".o" resultantes.

Goz
fonte
152
Você mesmo pode fazerg++ *.cpp -o output
rubenvb
7
De qualquer forma, isso é uma prática ruim? Eu gostaria de usar isso no meu makefile.
gabriel_vincent 26/09
8
@gabriel_vincent, não é necessariamente uma prática ruim, mas significa que editar um arquivo em um projeto de centenas fará com que o compilador refaça todo o trabalho de todos os arquivos. Compilar separadamente permite compilação incremental.
Paul Draper
@gabriel_vincent Você não deveria escrever makefiles à mão para começar. Use um sistema de compilação adequado, como o CMake.
Baum mit Augen
3
@BaummitAugen Sim, exceto que eu só quero compilar esse minúsculo programa de 2 arquivos que escrevi em 14 minutos, e eu realmente preferiria gastar um minuto escrevendo um makefile em vez de uma hora configurando o cmake.
Przemek D
55

Para compilar separadamente sem vincular, você precisa adicionar a -copção:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
FredAKA
fonte
3
Observe que se você deseja controlar o nome do executável na etapa de vinculação, faça o que você costuma fazer:g++ -o my_executable myclass.o main.o
eric
22

Agora que separei as classes para os arquivos .h e .cpp, preciso usar um makefile ou ainda posso usar o comando "g ++ main.cpp"?

Compilar vários arquivos de uma só vez é uma péssima escolha se você for colocar isso no Makefile.

Normalmente em um Makefile (para GNU / Make ), basta escrever que:

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

Dessa forma, makeseria recompilar adequadamente apenas o que precisa ser recompilado. Também é possível adicionar alguns ajustes para gerar as dependências do arquivo de cabeçalho - para que o make também reconstrua adequadamente o que precisa ser reconstruído devido às alterações no arquivo de cabeçalho.

Dummy00001
fonte
13

Você ainda pode usar o g ++ diretamente se desejar:

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

onde f1.cpp e f2.cpp são os arquivos com as funções neles. Para detalhes de como usar o make para fazer a compilação, consulte a excelente documentação do make do GNU .


fonte
12

Eu sei que essa pergunta foi feita anos atrás, mas ainda queria compartilhar como eu geralmente compilo vários arquivos c ++.

  1. Digamos que você tenha 5 arquivos cpp, tudo o que você precisa fazer é usar o * em vez de digitar o nome de cada arquivo cpp, por exemplo g++ -c *.cpp -o myprogram.
  2. Isso irá gerar "myprogram"
  3. executar o programa ./myprogram

Isso é tudo!!

O motivo pelo qual estou usando * é que, se você tiver 30 arquivos cpp, digitaria todos eles? ou apenas use o sinal * e economize tempo :)

ps Use esse método apenas se você não se importa com makefile.

zobair
fonte
1
Erro de redefinição surge quando eu uso essa abordagem? Existe outra maneira de fazer o mesmo?
Waseem Ahmad Naeem
11

.h arquivos não têm nada a ver com compilação ... você só se preocupa com arquivos cpp ... então digite g++ filename1.cpp filename2.cpp main.cpp -o myprogram

significa que você está compilando cada arquivo cpp e os vinculando myprgram.

então execute seu programa ./myprogram

Mateus
fonte
7

Como rebenvp disse, eu usei:

g++ *.cpp -o output

E faça isso para a saída:

./output

Mas uma solução melhor é usar o makearquivo. Leia aqui para saber mais sobre makearquivos.

Verifique também se você adicionou os .harquivos necessários nos .cpparquivos.

Pritam Banerjee
fonte
4

Você pode usar vários comandos do g ++ e depois vincular, mas o mais fácil é usar um Makefile tradicional ou outro sistema de compilação: como o Scons (que geralmente é mais fácil de configurar do que o Makefiles).

gauteh
fonte
2

Se você deseja usar #include <myheader.hpp>dentro de seus arquivos cpp, você pode usar:

g++ *.cpp -I. -o out
Matias Haeussler
fonte
1

Eu costumava usar um Makefile personalizado que compilava todos os arquivos no diretório atual, mas precisava copiá-lo em todos os diretórios que precisava, sempre.

Por isso, criei minha própria ferramenta - o Universal Compiler, que facilitou muito o processo ao compilar muitos arquivos.

Shubham Chaudhary
fonte
-4

~ / In_ProjectDirectory $ g ++ coord_main.cpp coord_func.cpp coord.h

~ / In_ProjectDirectory $ ./a.out

... Trabalhou !!

Usando o Linux Mint com Geany IDE

Quando salvei cada arquivo no mesmo diretório, um arquivo não foi salvo corretamente dentro do diretório; o arquivo coord.h. Então, verifiquei novamente e ele foi salvo como coorden.h, e não incorretamente como -> coord.h.gch. As pequenas coisas. Arg !!

Tim Conroy
fonte
3
Você está recebendo votos negativos porque incluiu arquivos h, o que é um erro.
22618