将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非常稳定。
答
库调用的顺序很重要。对我而言,这意味着将/usr/lib/libgsl.a发送到命令的末尾。这解决了它。
第一个建议不起作用 - 程序以 未定义的符号退出:gsl_rng_taus 这与我根本没有链接GSL的情况相同。 我不明白的是,为什么'-static'和'-shared'是矛盾的。在我的理解中,'-static'避免了其他库动态链接到我的库中,而'-shared'使我的库可以动态链接。 如果我指望GSL在其他系统上可用,是否可能存在版本或位置不合要求? – Wrzlprmft 2010-07-05 18:15:05
只是在这里检查:你有一个文件/usr/lib/libgsl.a? – 2010-07-05 18:46:22
是的,甚至将它复制到程序的文件夹,希望它可以帮助。 – Wrzlprmft 2010-07-05 19:40:47