Cześć, właśnie uczę się pracować na Linuxie (Ubuntu) i chciałem skompilować program. Napisałem program w C który składa się z trzech plików. Plik główny main.c, nagłówkowy calc.h i plik z obliczeniami calc.c. Chciałbym stworzyć plik makefile, tak żeby pliki calc.h i calc.c kompilowały się do biblioteki dynamicznej która następnie powinna zostać podlinkowana podczas kompilacji pliku main.c. Na razie mój makefile wygląda tak:
CC=gcc
all: main.o
$(CC) main.o -o program
main.o: main.c
$(CC) main.c -c -o main.o
calc.o: calc.c
$(CC) calc.c -fPIC calc.o
libfigure.so:calc.o
$(CC)-shared -Wl, -soname, libfigure.so -o libfigure.so calc.o
Plik main.c wygląda tak:
#include <stdio.h>
#include <stdlib.h>
#include "calc.h"
#include "calc.c"
int main()
{
int pick;
float a,b, result;
printf("====Pola Figur====\n");
printf(" \n");
printf("1. Pole prostokata\n");
printf("2. Pole kwadratu\n");
printf("3. Pole trojkata\n");
printf("4. Pole kola\n");
printf(" \n");
printf("Podaj wartosc: \n");
scanf("%d", &pick);
printf(" \n");
switch (pick){
case 1:
printf("Wybrales pole prostokota. Wzor na pole prostokota to \"P=a*b\"\n");
printf("Podaj dlugosc boku a: ");
scanf("%f", &a);
printf("Podaj dlugosc boku b: ");
scanf("%f", &b);
result=rectangle(a,b);
printf("Pole prostokota wynosi: ");
printf("%f\n", result);
break;
case 2:
printf("Wybrales pole kwadratu. Wzor na pole kwadratu to \"P=a*a\"\n");
printf("Podaj dlugosc boku a: ");
scanf("%f", &a);
result=square(a);
printf("Pole kwadratu wynosi: ");
printf("%f\n", result);
break;
case 3:
printf("Wybrales pole trojkata. Wzor na pole trojkata to \"P=(a*h)/2\"\n");
printf("Podaj dlugosc boku a: ");
scanf("%f", &a);
printf("Podaj wysokosc trojkata: ");
scanf("%f", &b);
result=triangle(a,b);
printf("Pole trojkata wynosi: ");
printf("%f\n", result);
break;
case 4:
printf("Wybrales pole kola. Wzor na pole kola to \"P=Pi*r^2\"\n");
printf("Podaj dlugosc promienia r: ");
scanf("%f", &a);
result=circle(a);
printf("Pole kola wynosi: ");
printf("%f\n", result);
break;
default: printf("Nie ma takiej opcji w menu");
}
return 0;
}
Plik calc.h tak:
#ifndef CALC_H
#define CALC_H
float rectangle(float a, float b);
float square(float a);
float triangle(float a, float b);
float circle(float a);
#endif
a plik calc.c tak:
#include "calc.h"
#include <math.h>
float rectangle(float a, float b)
{
return a*b;
}
float square(float a)
{
return a*a;
}
float triangle(float a, float b)
{
return a*b*0.5;
}
float circle(float a)
{
return a*a*M_PI;
}
Będę wdzięczny za wszystkie podpowiedzi i sugestie. Wcześniej napisałem innego makefila ale wyskakiwał mi błąd że funkcje rectangle,square, triangle i circle są podwójnie zdefiniowane.
Pozdrawiam