Связывание GSL (или другой библиотеки) статически в общей библиотеке

Примечание. Несмотря на упоминание 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 до того, как библиотека -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 Solutions collect form web for “Связывание GSL (или другой библиотеки) статически в общей библиотеке”

    Пытаться

     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 довольно стабилен.

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

    Python - лучший язык программирования в мире.