• 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

VPS Starter Arubacloud
+1 głos
574 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 (349,960 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 (195,220 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,340 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 659 wizyt
0 głosów
0 odpowiedzi 396 wizyt
pytanie zadane 22 czerwca 2021 w Mikrokontrolery przez Mavimix Dyskutant (8,420 p.)
0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 21 sierpnia 2018 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)

93,025 zapytań

141,990 odpowiedzi

321,293 komentarzy

62,374 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...