Подтвердить что ты не робот

Создание простого Makefile для создания общей библиотеки

Я пытаюсь создать очень простой ручной Makefile для создания общей библиотеки, чтобы проиллюстрировать точку.

Это то, что у меня есть до сих пор:

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)

Когда я запускаю make, он пытается создать приложение - и ld терпит неудачу, потому что он не может решить main().

Проблема, кажется, с CFLAGS - я указал -fPIC, но это не работает - что я делаю неправильно?

Изменить

Я добавил флаг -shared, как было предложено, когда я запустил make, я получил эту ошибку:

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

Кажется, что предлагается вернуться к -fPIC только.

Кстати, мой новый параметр CFLAGS:

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

Я запускаю gcc v4.4.3 на Ubuntu 10.0.4.

4b9b3361

Ответ 1

Решение заключалось в том, чтобы изменить XXFLAGS следующим образом:

FLAGS        = # -std=gnu99 -Iinclude
CFLAGS       = -fPIC -g #-pedantic -Wall -Wextra -ggdb3
LDFLAGS      = -shared

Ответ 2

Скомпилировать с помощью -shared:

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

(Это также работает на MingW под Windows для создания DLL.)

Ответ 3

Пример для файлов С++. Также включена чистая цель

.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 [email protected] $(LDFLAGS)

Ответ 4

Поскольку вы пытаетесь создать файл so, вам, вероятно, понадобится -shared.