Para compilar um programa que está modularizado em diversos fontes, compilando cada fonte de cada vez, é muito simples e muito útil, haja visto que você não precisará recompilar todos os módulos a todo o tempo, e sim somente o módulo alterado e os dependentes do módulo alterado.
Vou dar o exemplo utilizando 3 arquivos fontes, o aleatorio.f90, rotinas3.3.f90 e teste.f90. E utilizando o compilador ifort, o qual é distribuído gratuitamente pela Intel para uso não comercial, não estou querendo fazer propaganda da Intel, mas os compiladores dela, na minha humilde opnião, humilham os compiladores da GNU, mas isso é uma discussão a parte.
A interdependêcia está assim: teste.f90 depende de aleatorio.f90, o qual depende do rotinas3.3.f90.
Primeiro compilamos os dois primeiros como objeto, utilizando a opção -c do ifort:
$ ifort -c rotinas3.3.f90
rotinas3.3.f90(56): (col. 9) remark: LOOP WAS VECTORIZED.
rotinas3.3.f90(61): (col. 9) remark: PERMUTED LOOP WAS VECTORIZED.
$ ifort -c aleatorio.f90
aleatorio.f90(59): (col. 16) remark: LOOP WAS VECTORIZED.
Confira os objetos criados:
$ ls *.o
aleatorio.o rotinas3.3.o
Então compilamos o último programa para gerar o binário:
$ ifort teste.f90 rotinas3.3.o aleatorio.o -o teste.bin
E pronto, o último programa foi compilado, sem recompilar todos os outros módulos, usando um -v você conseguira ver que o ifort não recompila os objetos.
Isso tras uma vantagem imensa para projetos de muitos módulos, pois não há necessidade de recompilar tudo toda hora, por exemplo, se eu fizer um alteração em aletorio.f90, eu só preciso recompilar este módulo e o que depende dele, o arquivo teste.f90, evitando a recompilação desnecessária do arquivo rotinas3.3.f90.
Espero que a dica seja útil.
2 thoughts on “Compilando fontes em separado no FORTRAN.”
Vale ressaltar que o Fortran 90 também possui a cláusula INCLUDE, para quando deseja-se simplesmente reutilizar um módulo (em nova compilação)
Você pode definir seu módulo no arquivo ‘modulo.f90’ e usá-lo no programa principal ‘programa.f90’.
Fala Pedro,
Valeu a dica ;)
Eu tenho usado da seguinte forma, defino os módulos em arquivos separados utilizando o MODULE, depois eu chamo as subrotinas necessárias utilizando a cláusula USE subrotina, depois é só compilar tudo junto com os objetos, como demonstrado no exemplo do post.
Mas vou dar uma olhada nessa cláusula INCLUDE, pois gostei da dica ;) Valeu!