将 GSL(或其他库)静态链接到共享库

发布于 2024-09-08 09:49:22 字数 1280 浏览 3 评论 0原文

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

在库链接结果之前添加 -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。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧城空念 2024-09-15 09:49:22

尝试一下

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 非常稳定。

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.

谷夏 2024-09-15 09:49:22

库调用的顺序很重要。对我来说,这意味着将 /usr/lib/libgsl.a 发送到命令末尾。这解决了它。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文