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

问题描述:

注意:尽管在下面提到了Python,但我的问题很可能不是Python相关的。如果我没有弄错,我提到的“模块”相当于一个C库 - 至少是为了解决我的问题。将GSL(或其他库)静态链接到共享库中

在Debian上我试图用C创建一个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,排列选项。 我还没有尝试,正在编译与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非常稳定。

+0

第一个建议不起作用 - 程序以 未定义的符号退出:gsl_rng_taus 这与我根本没有链接GSL的情况相同。 我不明白的是,为什么'-static'和'-shared'是矛盾的。在我的理解中,'-static'避免了其他库动态链接到我的库中,而'-shared'使我的库可以动态链接。 如果我指望GSL在其他系统上可用,是否可能存在版本或位置不合要求? – Wrzlprmft 2010-07-05 18:15:05

+0

只是在这里检查:你有一个文件/usr/lib/libgsl.a? – 2010-07-05 18:46:22

+0

是的,甚至将它复制到程序的文件夹,希望它可以帮助。 – Wrzlprmft 2010-07-05 19:40:47

库调用的顺序很重要。对我而言,这意味着将/usr/lib/libgsl.a发送到命令的末尾。这解决了它。