Tworzenie prostego pliku Makefile do budowy biblioteki współdzielonej

Próbuję stworzyć bardzo podstawowy ręcznie wykonany plik Makefile, aby stworzyć współdzieloną bibliotekę, aby zilustrować punkt.

Oto co mam do tej pory:

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)

Kiedy uruchamiam make, próbuje zbudować aplikację - i ld nie udaje się, ponieważ nie może rozwiązać main().

Problem wydaje się być z CFLAGS - podałem -fPIC ale to nie działa - co robię źle?

Edytuj

Dodałem flagę -shared zgodnie z sugestią, kiedy uruchamiam make, dostałem to błąd:

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

Co wydaje się sugerować powrót do -fPIC tylko.

BTW, moje nowe CFLAGS ustawienie to:

CFLAGS       = -fPIC -shared -pedantic -Wall -Wextra -march=native -ggdb3

Uruchamiam gcc v4. 4. 3 Na Ubuntu 10.0.4.

Author: Rodrigo de Azevedo, 2011-11-11

4 answers

Rozwiązaniem było zmodyfikowanie XXFLAGS w następujący sposób:

FLAGS        = # -std=gnu99 -Iinclude
CFLAGS       = -fPIC -g #-pedantic -Wall -Wextra -ggdb3
LDFLAGS      = -shared
 24
Author: Homunculus Reticulli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-11 21:49:19

Kompiluj z -shared:

gcc -o libfoo.so module1.o module2.o -shared

(działa to również na MingW pod Windows, aby produkować biblioteki DLL.)

 11
Author: Kerrek SB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-11 15:18:31

Przykład dla plików C++. Zawiera również czysty cel

.PHONY : clean

CPPFLAGS= -fPIC -g
LDFLAGS= -shared

SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS=$(SOURCES:.cpp=.o)

FIKSENGINE_LIBDIR=../../../../lib
FIKSENGINE_INCDIR=../../../../include

TARGET=$(FIKSENGINE_LIBDIR)/tinyxml.so

all: $(TARGET)

clean:
    rm -f $(OBJECTS) $(TARGET)

$(TARGET) : $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $@ $(LDFLAGS)
 4
Author: rgb122,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 14:24:51

Ponieważ próbujesz zbudować so plik, prawdopodobnie potrzebujesz -shared.

 1
Author: Michael Krelin - hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-11 15:19:25