terça-feira, 31 de janeiro de 2012

Definindo Macros para diretivas de compilação

Hoje vamos aprender a usar algumas diretivas de compilação. As vezes é necessário fazermos um debug de nosso programa. Para isso ao invés de definirmo um #define em  nosso código, vamos incluir no momento da compilação.

Vamos ver um pequeno exemplo. Vamos criar um arquivo em c com o seguinte código:


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num1, num2, result;
    printf("\n\tDigite o priemiro Numero: ");
    scanf("%d",&num1);
    printf("\n\tDigite o segundo Numero: ");
    scanf("%d", &num2);

    #ifdef DEBUG
    printf("\n\tOs valores que voce digitou: %d %d", num1, num2);
    #endif

    printf("\n\tResultado %d + %d = %d", num1, num2, num1 + num2);

    return 1;
}

Agora, vamos compilar o nosso código com a seguinte sintaxe: gcc -D DEBUG -o somaDoisN soma.c
Quando o programa for executado, ele vai mostrar na tela o printf entre o #ifdef e o #endif

Vamos mudar a compilação, vamos retirar a diretiva de compilação para DEBUG:
gcc  -o somaDoisN soma.c 

Agora a mensagem não vai mais ser mostrada!!!!


sábado, 7 de janeiro de 2012

Shared Libraries no Linux

Shared libraries são bibliotecas que são carregadas pelos programas quando eles iniciam.

Precisamos entender a diferença entre o nome da biblioteca, soname, e seu real name.
Toda shared library tem um nome especial chamado de "soname". O soname tem o prefixo "lib", o nome da biblioteca, o sufixo ".so" seguido de ponto e um número de versão que é incrementado sempre que a interface muda. Normalmenteo soname é um link simbólico para o real name da shared library.
Exemplo de soname: libctest.so.1

Toda a shareed libray possui um real name. Que é o nome do arquivo que contém o código da biblioteca. O real name adiciona ao soname um ponto, um número, que é o minor number, outro ponto e o número da versão.
Exemplo de real name: libctest.so.1.0

Além disso, há um nome usado pelo compilador para requisitar a library, que é simplesmente o soname sem nenhum número de versão.
Exemplo: libctest.so


Colocando em prática:

Primeiramente vamos ter dois arquivos que são:
operacoes.c – que vai conter nosso código fonte
operacoes.h – que vai conter apenas as definições

Código do arquivo operacoes.c

#include "operacoes.h"

int somaDeInterios (int n1, int n2)
{
return n1 + n2;
}

int multInteiros (int n1, int n2)
{
return n1 * n2;
}

Código do arquivo operacoes.h

#ifndef _OPERACOES
#define _OPERACOES

int somaDeInterios (int n1, int n2);
int multInteiros (int n1, int n2);

#endif


Agora vamos digitar o comandos:
gcc -fPIC -c operacoes.c
Veja que fio gerado o aquivo: operacoes.o

Agora, vamos gerar a nossa library propriamente dita:

gcc -shared -Wl,-soname,libcmatematica.so.1 -o libcmatematica.so.1.0 operacoes.o

Vamos copiar o arquivo gerado: libcmatematica.so.1.0 para dentro da pasta /usr/lib, talvez você deva estar logado como root para executar esse passo:

cp libcmatematica.so.1.0 /usr/lib

Agora vamos criar os links necessários, talvez tenha que estar logado com root:

ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so
ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so.1

Bom, agora, vamos criar um simples programa para verificar se a nossa biblioteca realmente funciona.

Vamos chamar nosso arquivo de main.c

Código do arquivo main.c

#include "operacoes.h"
#include <stdio.h>

int main()
{
printf("\n\tTeste da Shared library");
printf("\n\t5 + 2 = %d", somaDeInterios(5,2));
printf("\n\t5 * 2 = %d", multInteiros(5,2));
}

Para compilar:
gcc main.c -lcmatematica -o operacoesInteiras

Resultado:
Teste da Shared library
5 + 2 = 7
5 * 2 = 10