Incluir arquivos e módulos#

Se programa pode estar contido em vários arquivos fonte, todos armazenado no mesmo diretório ou organizados em alguma árvore de diretórios conveniente. Os detalhes da organização dependem de gosto pessoal, acordos feitos pelo grupo de desenvolvedores que você pertença, ou simplesmente a história do programa. Qualquer que seja a estrutura do diretório, você encontrará uma situação onde seu compilador precisa de assistência para compilador um arquivo fonte particular:

  • Fortran (e outras linguagens) tem a possibilidade de incluir um arquivo externo. Enquanto que essa funcionalidade se torna um pouco menos útil com o advento de módulos, ainda há alguns usos. Frequentemente, «include files» são armazenados em um diretório separados dos diretórios contendo arquivos fonte, porque eles serão usados em diversos locais. Muito frequente, o nome desse diretório é «include».

  • Como vimos, compilando o código fonte que define um ou mais módulo, leva ao compilar gerar os chamados «arquivos módulo intermediários» (com a extensão «.mod»). O compilador precisa de acesso à esses arquivos para ser capaz de ler as interfaces e variáveis para assim, baseado nessa informação, compilar o código fonte que usa vários módulos.

Compiladores suportam opções como -I para indicar onde estão esses arquivos de inclusão e arquivos de módulo intermediários. Supondo que armazenamos dois arquivos do nosso programa tabulate na seguinte estrutura de diretórios:

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90

Compilando o arquivo «functions.f90» com os comandos

$ cd sub
$ gfortran -c functions.f90

leva a esta estrutura:

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90
        user_functions.mod
        functions.o

Para compilar com sucesso e subsequentemente realizar o build do programa nós precisamos dizer ao compilador onde encontrar o arquivo «user_functions.mod»:

$ cd main
$ gfortran -c tabulate.f90 -I ../sub
$ gfortran -o tabulate tabulate.o ../sub/functions.o

O resultado:

tabulate/
    main/
        tabulate.f90
        tabulate.o
        tabulate (or tabulate.exe on Windows)
    sub/
        functions.f90
        functions.o
        user_functions.mod

Notas:

  • Os detalhes diferem por compilador. Algumas vezes a opção -l deve ser seguida de um espaço e então o nome do diretório, outras vezes o diretório deve vir consecutivamente.

  • Por padrão os arquivos de módulos intermediários (.mod) são guardados no mesmo diretórios que os arquivos de objeto. Quando seu código é organizado em diferentes subdiretórios, eles ficarão espalhados pela árvore de diretórios, complicando o processo de compilação. Por sorte, muitos compiladores permitem que você especifique a localização de saída desses arquivos. Para gfortran é -J, por exemplo: -J../include (para assim os arquivos .mod aparecerem no mesmo diretório)

  • Para programas grandes, consistindo em vários arquivos fonte, é importante pensar qual organização usará.