Я пытаюсь создать очень простой ручной 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.