Criando uma static library

Uma static library pode ter seu código objeto incluído diretamente no código objeto do seu arquivo executável linkado com a static library. Diferente das dlls, cujo código objeto é carregado dinamicamente.

Para um exemplo menos detalhado que o exemplo prático, visite: static libraries

Para criar uma static library, deve ser utilizado o archiver, ao invés do compilador gcc/g++.

Vamos a um exemplo prático:

  1. Crie dois projetos: libmath e app. (Você pode dar os nomes que quiser).
  2. Agora, vá para o projeto libmath, crie o arquivo "libmath.h" com o seguinte conteúdo:

    libmath.h
    #ifndef LIBMATH_H
    #define LIBMATH_H
    
    namespace libmath {
    
        int fatorial( int n );
    
    }
    
    #endif
    
  3. Agora crie o arquivo "libmath.cpp" com o seguinte conteúdo:

    libmath.cpp
    #include "libmath.h"
    
    namespace libmath {
    
        int fatorial( int n ) {
            if ( n <= 1 )
                return 1;
            return n * fatorial( n-1 );
        }
    
    }
    
  4. Agora crie o arquivo FoxMakefile com o seguinte conteúdo:

    FoxMakefile
    output.file.name=libmath.a
    
    linker.params=-static
    

    O CBuidFile acima especifica o arquivo de saída que, no caso de static libraries, deve começar com "lib" e ter extensão ".a" ou, no windows, pode ter extensão ".lib" ou ".a". A opção -static é necessária para o linker gerar a biblioteca estática.

    Seu projeto deve ter agora a seguinte estrutura de arquivos:

    libmath
    ├── FoxMakefile
    ├── libmath.cpp
    └── libmath.h 
    
  5. Feito isto, pode executar o seguinte comando, estando na raiz do projeto:
    foxmake archivebuildall

    Esse comando compila todos os arquivos e empacota numa static library.

    Agora, deve ter sido criado na pasta "build" o arquivo libmath.a

  6. Agora vá para o projeto app e copie o arquivo libmath.a para a raiz do projeto.
  7. Crie também uma pasta chamada "include" e copie para ela o arquivo "libmath.h" do projeto "libmath".
  8. Depois, crie o arquivo "main.cpp" com o seguinte conteúdo:

    main.cpp
    #include <libmath.h>
    
    #include <iostream>
    
    using namespace std;
    
    
    int main() {
        int num;
        cout << "Informe um numero: " << std::flush;
        cin >> num;
    
        int fat = libmath::fatorial( num );
    
        cout << endl;
        cout << "O fatorial de " << num << " eh: " << fat << endl;
    
        return 0;
    }
    
  9. Agora crie o FoxMakefile para este projeto com o seguinte conteúdo:

    FoxMakefile
    output.file.name=app
    
    build.files=libmath.a
    
    linker.params=-ldl -rdynamic
    
    lib.dirs=.
    include.dirs=include
    libs=math
    

    As opções -ldl e -rdynamic, são necessárias para linkar bibliotecas dinâmicas no linux. Se estiver no windows, pode excluir essa linha do FoxMakefile.

    A propriedade "build.files" serve apenas para copiar a lib "libmath.a" para pasta "build", após o a linkagem do executável.

    Seu projeto deve ter agora a seguinte estrutura de arquivos:

    app
    ├── FoxMakefile
    ├── include
    │   └── libmath.h
    ├── libmath.a
    └── main.cpp
    
  10. Feito isso, pode executar o seguinte comando:
    foxmake buildall
  11. Agora navegue até a pasta build e execute o executável de nome "app", conforme a seguir:
    cd build
    ./app
    

    Você interagirá com o programa conforme a seguir:

Para baixar o projeto "static-library" abordado nessa página, acesse:

Download: static-library.zip.

Próxima aula

O próxima aula ensina como criar uma biblioteca dinâmica para linux ou windows.