python – 将GSL(或其他库)静态链接到共享库

注意:尽管下面提到了Python,但我的问题很可能与Python无关.如果我没有弄错,我提到的“模块”相当于一个C库 – 至少是我的问题所关注的问题.

在Debian上我试图用C创建一个Python模块,然后使用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

其他东西,不起作用:用fPIC重新编译GSL,-static-libgcc,排列选项.
我还没有尝试过,用fPIC或类似方法编译gcc.

解决方法:

尝试

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非常稳定.

上一篇:使用C(和GSL)扩展和嵌入Python(和NumPy):将gsl_matrix传递给python并返回


下一篇:Cython,C和gsl