• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Plik Makefile i Biblioteki dynamiczne. Linux Ubuntu

Object Storage Arubacloud
+1 głos
465 wizyt
pytanie zadane 8 kwietnia 2021 w C i C++ przez believer88 Nowicjusz (240 p.)

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

komentarz 8 kwietnia 2021 przez believer88 Nowicjusz (240 p.)
przeniesione 8 kwietnia 2021 przez Comandeer
Ok, może dopowiem, że robię to zadanie na zaliczenie i prowadzący zajęcia napisał mi tak: "Pliki calc.h i calc.c powinny się u Pana kompilować do biblioteki dynamicznej, która następnie powinna zostać podlinkowana podczas kompilacji pliku main.c.". Dodał jeszcze: "Polecenie make kompiluje u Pana zwykłe rozwiązanie wieloplikowe, nie rozwiązanie z użyciem biblioteki dynamicznej." Bardzo proszę, o jakieś sugestie jak to zrobić, ponieważ poprawienie pliku makefile jest warunkiem zaliczenia.
1
komentarz 8 kwietnia 2021 przez adrian17 Ekspert (344,860 p.)

Po pierwsze, to co napisał Oscar:

Inkludujesz calc.c do main - w tym momencie idea biblioteki traci sens.

Po drugie, masz dużo błędów w tym makefile, niemal w każdej linii. Twój `all` w ogóle nie zależy od zbudowanei libfigure.so. Niektóre rzeczy jak ten `soname` też nie są potrzebne.

Proponuję na początek "z ręki" zbudować cały ten program, a dopiero potem się zastanowić jak te komendy wrzucić do Makefile'a. Na przykład tutaj jest krótka lista kroków jak zbudować:

https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html

2 odpowiedzi

+1 głos
odpowiedź 8 kwietnia 2021 przez j23 Mędrzec (194,920 p.)
CC = gcc
 
all: main.o libfigure.so
	$(CC) main.o -Wl,-rpath=. -L. -lfigure -o program 
 
main.o: main.c
	$(CC) main.c -c -o main.o
     
calc.o: calc.c
	$(CC) calc.c -c -o calc.o
	
libfigure.so: calc.o
	$(CC) -shared -fPIC calc.o 

i wywal to #include "calc.c"

0 głosów
odpowiedź 8 kwietnia 2021 przez Oscar Nałogowiec (29,320 p.)

Inkludujesz calc.c do main - w tym momencie idea biblioteki traci sens.

Biblioteki dynamiczne nie są linkowane w czasie linkowania tylko uruchamiania. Zdecyduj się co chcesz osiągnąć.

W pierwszym warunku w makefile cel nazywa się all, a tworzysz tam plik nazywa się program - będzie zawsze wykonywał linkowanie. Cel all zwykle dodaje się w celu wymienienia listy programów, które trzeba zbudować, a działanie tam zawarte jest puste lub jest to wyświetlenie komunikatu typu "Gotowe".

Podobne pytania

0 głosów
0 odpowiedzi 476 wizyt
0 głosów
0 odpowiedzi 310 wizyt
pytanie zadane 22 czerwca 2021 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 21 sierpnia 2018 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...