View Full Version : [gcc] linkare librerie
salve, nel mio progetto ho creato 2 librerie, quindi mi ritrovo con questi 4 file:
lib.h lib.c
lib2.h lib2.c
Ora, come compilo il programma linkando le 2 librerie? Ho cercato un po' su google ma non ho capito bene, se qualcuno me lo spiega in modo chiaro...
Vincenzo1968
28-01-2013, 17:09
salve, nel mio progetto ho creato 2 librerie, quindi mi ritrovo con questi 4 file:
lib.h lib.c
lib2.h lib2.c
Ora, come compilo il programma linkando le 2 librerie? Ho cercato un po' su google ma non ho capito bene, se qualcuno me lo spiega in modo chiaro...
Supponendo che il file che utilizza le funzioni delle libreria si chiami "main.c", puoi compilare così:
gcc -O3 main.c lib.c lib2.c -o myapp
Attenzione: -O3 non è "segno meno seguito da zero seguito da tre" ma "segno meno seguito da lettera O maiuscola seguita da tre".
Per eseguire il programma appena creato:
./myapp
;)
EDIT: ovviamente il file main.c deve contenere gli include alle due librerie:
#include "lib.h"
#include "lib2.h"
Vincenzo1968
28-01-2013, 19:45
Vabbuò se Joker intendeva le librerie a collegamento dinamico o statico non deve fare altro che fare un fischio.
Vincenzo1968
28-01-2013, 20:44
libreria a collegamento statico(static Library):
http://img594.imageshack.us/img594/7040/libstatic.jpg
lib1.h:
#ifndef MY_LIB1_H
#define MY_LIB1_H
int somma(int x, int y);
#endif /* MY_LIB1_H */
lib1.c:
#include <stdio.h>
#include <stdlib.h>
#include "lib1.h"
int somma(int x, int y)
{
return x + y;
}
lib2.h
#ifndef MY_LIB2_H
#define MY_LIB2_H
int sottrazione(int x, int y);
#endif /* MY_LIB2_H */
lib2.c
#include <stdio.h>
#include <stdlib.h>
#include "lib2.h"
int sottrazione(int x, int y)
{
return x - y;
}
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "lib1.h"
#include "lib2.h"
int main()
{
int a, b, x, y;
a = 8;
b = 5;
x = somma(a, b);
y = sottrazione( a, b);
printf("\n%d + %d = %d\n", a, b, x);
printf("\n%d - %d = %d\n", a, b, y);
return 0;
}
Vincenzo1968
28-01-2013, 21:54
Libreria a collegamento dinamico(shared library):
http://img802.imageshack.us/img802/9333/sharedlib.jpg
lib1.h:
#ifndef MY_LIB1_H
#define MY_LIB1_H
#if defined _WIN32 || defined __CYGWIN__
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
#else
#if __GNUC__ >= 4
#define MYDLL_API __attribute__ ((visibility ("default")))
#else
#define MYDLL_API
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
MYDLL_API int somma(int x, int y);
#ifdef __cplusplus
}
#endif
#endif /* MY_LIB1_H */
lib1.c:
#include <stdio.h>
#include <stdlib.h>
#define MYDLL_EXPORTS
#include "lib1.h"
MYDLL_API int somma(int x, int y)
{
return x + y;
}
lib2.h
#ifndef MY_LIB2_H
#define MY_LIB2_H
#if defined _WIN32 || defined __CYGWIN__
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
#else
#if __GNUC__ >= 4
#define MYDLL_API __attribute__ ((visibility ("default")))
#else
#define MYDLL_API
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
MYDLL_API int sottrazione(int x, int y);
#ifdef __cplusplus
}
#endif
#endif /* MY_LIB2_H */
lib2.c:
#include <stdio.h>
#include <stdlib.h>
#define MYDLL_EXPORTS
#include "lib2.h"
MYDLL_API int sottrazione(int x, int y)
{
return x - y;
}
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "lib1.h"
#include "lib2.h"
int main()
{
int a, b, x, y;
a = 8;
b = 5;
x = somma(a, b);
y = sottrazione( a, b);
printf("\n%d + %d = %d\n", a, b, x);
printf("\n%d - %d = %d\n", a, b, y);
return 0;
}
Vincenzo1968
29-01-2013, 11:06
http://img213.imageshack.us/img213/5244/mylibstatic.jpg
http://img818.imageshack.us/img818/1874/mylibshared.jpg
Vincenzo1968
29-01-2013, 12:33
http://gcc.gnu.org/wiki/Visibility
For anyone who has worked on any sizeable portable application on both Windows and POSIX, you'll know the sense of frustration that non-Windows builds of GCC don't offer an equivalent to __declspec(dllexport) i.e. the ability to mark your C/C++ interface as being that of the shared library. Frustration because good DSO interface design is just as important for healthy coding as good class design, or correctly opaquing internal data structures.
While the semantics can't be the same with Windows DLL's and ELF DSO's, almost all Windows-based code uses a macro to compile-time select whether dllimport or dllexport is being used. This mechanism can be easily reused with this patch so adding support to anything already able to be compiled as a Windows DLL is literally a five minute operation.
Note: The semantics are not the same between Windows and this GCC feature - for example, __declspec(dllexport) void (*foo)(void) and void (__declspec(dllexport) *foo)(void) mean quite different things whereas this generates a warning about not being able to apply attributes to non-types on GCC.
grazie, molto esaustivo :asd:
Vincenzo1968
29-01-2013, 14:13
grazie, molto esaustivo :asd:
Non c'è di che ;)
Ma ti interessava creare una libreria (static e/o shared) o compilare i file insieme al main.c?
mi interessava la compilazione, la libreria l'avevo già creata
la libreria non è il file .a?
Vincenzo1968
29-01-2013, 14:42
la libreria non è il file .a?
Esatto. La libreria a collegamento statico.
La libreria a collegamento dinamico ha l'estensione .so
I file .o sono i moduli oggetto che crea il compilatore con l'opzione -c.
;)
The_ouroboros
29-01-2013, 14:56
La libreria a collegamento dinamico ha l'estensione .so
le dll di linux :cool:
Vincenzo1968
29-01-2013, 15:08
le dll di linux :cool:
Linux mon amour :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.