2010-07-05 161 views
4

注意:儘管在下面提到了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。

回答

2

嘗試

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

0

庫調用的順序很重要。對我而言,這意味着將/usr/lib/libgsl.a發送到命令的末尾。這解決了它。

相關問題