Связывание GSL (или другой библиотеки) статически в общую библиотеку - PullRequest
4 голосов
/ 05 июля 2010

Примечание: Несмотря на упоминание 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 или подобного.

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

Попробуйте

gcc -Wall -fPIC -O3 -shared -o meinzeug.so /usr/lib/libgsl.a -lm meinzeug.

как вы не можете сделать

gcc -Wall -fPIC -O3 -shared -static ...   # shared and static at the same time ?

чтобы вы предоставили статическую библиотеку GSL вместе с вашим кодом.

В конце дня я бы зависал и держал зависимость от GSL. Почти у всех это есть, и API довольно стабилен.

0 голосов
/ 21 ноября 2012

Порядок библиотечных вызовов важен.Для меня это означало отправку файла /usr/lib/libgsl.a в конец команды.Это решило это.

...