Linking GSL (or other library) statically into a shared library

匿名 (未验证) 提交于 2019-12-03 07:36:14

问题:

Note: Despite the mentioning of Python in the following there is a good chance for my problem not to be Python related at all. If I am not mistaken the “module” I mention is equivalent to a C library―at least for the concerns of my problem.

On Debian I am trying to create a Python module with C, which in turn uses the GSL. The following Makefile successfully compiles it:

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 

Because this module is supposed to be used by (Linux) machines other than mine, I want the GSL to be included into the module (or be shipped with it).

However, if I add -static as option to the last line of the Makefile, I get the following error:

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 before the library linking results in a different error:

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 

Other Stuff, that did not work: Recompiling GSL with fPIC, -static-libgcc, permutating the options. What I did not try yet, is compiling gcc with fPIC or similar.

回答1:

Try

gcc -Wall -fPIC -O3 -shared -o meinzeug.so /usr/lib/libgsl.a -lm meinzeug. 

as you cannot do

gcc -Wall -fPIC -O3 -shared -static ...   # shared and static at the same time ? 

so you would provide the static library of GSL alongside with your code.

At the end of the day, I would punt and keep the dependency on the GSL. Just about everybody has it, and the API is pretty stable.



回答2:

The ordering of the library calls is important. For me, it meant sending the /usr/lib/libgsl.a to the end of the command. That solved it.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!