Exemplos Práticos de Ligação
Estrutura de Projeto e Estratégias de Ligação
graph TD
A[Projeto Prático de Ligação] --> B[Ficheiros de Cabeçalho]
A --> C[Ficheiros de Implementação]
A --> D[Programa Principal]
B --> E[Declarações de Funções]
C --> F[Implementações de Funções]
D --> G[Ponto de Entrada do Programa]
Exemplo 1: Biblioteca de Calculadora Simples
Estrutura do Projeto
projeto_calculadora/
│
├── include/
│ └── calculator.h
├── src/
│ ├── add.c
│ ├── subtract.c
│ └── multiply.c
└── main.c
Ficheiro de Cabeçalho: calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
#endif
Ficheiros de Implementação
// add.c
#include "../include/calculator.h"
int add(int a, int b) {
return a + b;
}
// subtract.c
#include "../include/calculator.h"
int subtract(int a, int b) {
return a - b;
}
// multiply.c
#include "../include/calculator.h"
int multiply(int a, int b) {
return a * b;
}
Programa Principal: main.c
#include <stdio.h>
#include "include/calculator.h"
int main() {
int x = 10, y = 5;
printf("Adição: %d\n", add(x, y));
printf("Subtração: %d\n", subtract(x, y));
printf("Multiplicação: %d\n", multiply(x, y));
return 0;
}
Processo de Compilação
## Criar ficheiros objeto
gcc -c -I./include src/add.c -o add.o
gcc -c -I./include src/subtract.c -o subtract.o
gcc -c -I./include src/multiply.c -o multiply.o
gcc -c -I./include main.c -o main.o
## Ligar ficheiros objeto
gcc add.o subtract.o multiply.o main.o -o calculadora
Exemplo 2: Criação de Biblioteca Estática
Passos de Criação da Biblioteca
## Compilar ficheiros objeto
gcc -c -I./include src/add.c src/subtract.c src/multiply.c
## Criar biblioteca estática
ar rcs libcalculator.a add.o subtract.o multiply.o
## Compilar o programa principal com a biblioteca estática
gcc main.c -L. -lcalculator -I./include -o calculadora
Comparação de Estratégias de Ligação
| Tipo de Ligação |
Vantagens |
Desvantagens |
| Ligação Estática |
Inclusão completa de dependências |
Tamanho executável maior |
| Ligação Dinâmica |
Tamanho executável menor |
Dependência de biblioteca em tempo de execução |
| Ligação Modular |
Melhoria na organização do código |
Compilação mais complexa |
Técnicas Avançadas de Ligação
Compilação Condicional
#ifdef DEBUG
printf("Informação de depuração\n");
#endif
Diretivas Pragma
#pragma once // Proteção de cabeçalho moderna
Gestão de Erros na Ligação
Erros Comuns de Ligação
- Referência indefinida
- Definição múltipla
- Biblioteca não encontrada
Técnicas de Depuração
## Verificar referências de símbolos
nm calculadora
## Verificar dependências de bibliotecas
ldd calculadora
Boas Práticas
- Usar proteções de cabeçalho em ficheiros de cabeçalho
- Minimizar variáveis globais
- Organizar o código em módulos lógicos
- Usar declarações antecipadas
- Gerenciar cuidadosamente as dependências de bibliotecas
No LabEx, recomendamos a prática destas técnicas de ligação para construir aplicações C robustas.