【问题标题】:Linking GSL (or other library) statically into a shared library将 GSL(或其他库)静态链接到共享库
【发布时间】:2010-07-05 17:12:06
【问题描述】:

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

【问题讨论】:

    标签: python c linker gsl


    【解决方案1】:

    试试

    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 相当稳定。

    【讨论】:

    • 第一个建议不起作用——程序以未定义的符号退出:gsl_rng_taus,就像我根本没有链接 GSL 一样。我不明白的是,为什么-static-shared 是矛盾的。据我了解-static 避免了其他库动态链接到我的库中,而-shared 使我的库可以依次动态链接。如果我指望 GSL 在其他系统上可用,是否存在版本或位置不兼容?
    • 只是在这里检查一下:你有一个文件 /usr/lib/libgsl.a 吗?
    • 是的,甚至将它复制到程序的文件夹中,希望它可能会有所帮助。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多