注意:尽管下面提到了 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
Adding -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、-static-libgcc 重新编译 GSL,排列选项。
我还没有尝试使用 fPIC 或类似的工具编译 gcc。