Примечание: Несмотря на упоминание Python в следующем, у моей проблемы есть хороший шанс вообще не быть связанным с Python. Если я не ошибаюсь, «модуль», о котором я упоминаю, эквивалентен библиотеке C - по крайней мере, из-за проблем моей проблемы.
В Debian я пытаюсь создать модуль Python с C, который, в свою очередь, использует GSL. Следующий Makefile успешно скомпилирует его:
CC = gcc -Wall -fPIC -O3
NAME = meinzeug
matrizenwuerfler: $(SRC)
$(CC) -o $(NAME).o -I/usr/lib/python2.5/site-packages/numpy/core/include -I/usr/include/python2.5 -c $(NAME).c
$(CC) -shared -o $(NAME).so -lgsl -lgslcblas -lm $(NAME).o
Поскольку предполагается, что этот модуль будет использоваться (Linux) машинами, отличными от моей, я хочу, чтобы GSL был включен в модуль (или поставлялся с ним).
Однако, если я добавлю -static
в качестве опции в последнюю строку Makefile, я получу следующую ошибку:
gcc -Wall -fPIC -O3 -shared -static -o meinzeug.so -lgsl -lgslcblas -lm meinzeug.o
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Добавление -Wl,-Bstatic
перед связыванием библиотеки приводит к другой ошибке:
gcc -Wall -fPIC -O3 -shared -o meinzeug.so -Wl,-Bstatic -lgsl -lgslcblas -lm meinzeug.o
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
Другие вещи, которые не работали: Перекомпиляция GSL с помощью fPIC, -static-libgcc, перестановка опций.
То, что я еще не пробовал, это компиляция gcc с использованием fPIC или подобного.