La création d'un simple fichier Makefile pour construire une bibliothèque partagée
Je suis en train de créer un très de base fabriqués à la main Makefile pour créer une bibliothèque partagée pour illustrer un point.
C'est ce que j'ai à ce jour:
SHELL = /bin/sh
CC = gcc
FLAGS = -std=gnu99 -Iinclude
CFLAGS = -fPIC -pedantic -Wall -Wextra -march=native -ggdb3
DEBUGFLAGS = -O0 -D _DEBUG
RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program
TARGET = example.so
SOURCES = $(shell echo src/*.c)
HEADERS = $(shell echo include/*.h)
OBJECTS = $(SOURCES:.c=.o)
PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(FLAGS) $(CFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJECTS)
Quand je lance make
, il tente de construire une application - et ld
échoue car il ne peut pas résoudre main()
.
Problème semble être avec CFLAGS
- j'ai spécifié -fPIC
mais qui ne fonctionne pas - ce que je fais mal?
Modifier
J'ai ajouté le -shared
drapeau, comme l'a suggéré, lorsque je lance make
, j'ai eu cette erreur:
gcc -std=gnu99 -Iinclude -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3 -O0 -D _DEBUG -o example.so src/example.o
/usr/bin/ld: src/example.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
src/example.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [example.so] Error 1
Qui semble être ce qui suggère de revenir à -fPIC
seulement.
BTW, mon nouveau CFLAGS
paramètre est:
CFLAGS = -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3
Je suis en cours d'exécution gcc v4.4.3 sur Ubuntu 10.0.4.
- Je pense que vous êtes absent
-shared
dans leCFLAGS
, etld
tente de créer un exécutable de cette façon. - Je voudrais utiliser
$(wildcard src/*.c)
au lieu de$(shell echo src/*.c)
, mais je me demandais s'il y a des différences sérieuses. - Un titre plus approprié pour cette question serait "la Création d'une bibliothèque partagée - quel est le problème avec ces compiler et lier les options?" Vous êtes en présentant cela comme un problème avec votre makefile, mais il n'y a rien de mal à cela. Il offre exactement ce que vous demandez de lui.
- Veuillez vérifier le lien aussi stackoverflow.com/a/43347369/1485176
Vous devez vous connecter pour publier un commentaire.
La solution a été de modifier le XXFLAGS comme suit:
Compiler avec
-shared
:(Cela fonctionne aussi sur MingW sous Windows pour produire de la Dll.)
-shared
est une option de l'éditeur de liens, donc je voudrais l'ajouter àLDFLAGS
. Modifier Oups, vous n'avez pas pourLDFLAGS
. Je vous recommande de créer cette variable et l'ajouter à la commande de liaison.Exemple pour les fichiers C++. Également inclus une cible clean
Puisque vous essayez de construire
so
fichier, vous avez probablement besoin de-shared
.