注意:儘管在下面提到了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。
第一個建議不起作用 - 程序以 未定義的符號退出: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