创建静态链接共享库

问题描述

是否可以创建一个本身静态链接的共享库,即它不依赖于其他共享库?

让我更具体一点.. 我想创建一个共享库,比如 mylib.so,它使用了一些其他特殊库(在我的例子中是它的 intel mkl 和 openMP)。由于我已经安装了这些库,因此我可以构建 mylib.so 并将其包含在其他程序中而不会出现任何问题。 但是,如果我想在另一台机器上使用库(或包括它的可执行文件),我首先必须安装所有英特尔的东西。有没有办法避免这种情况?我的第一次尝试是在构建 mylib.so添加选项 -static 但这似乎没有任何作用..

我正在使用 icc..

解决方法

是否可以创建一个本身静态链接的共享库,即它不依赖于其他共享库?

不适用于 Linux,不适用于使用 GLIBC(您的共享库总是至少依赖于 ld-linux*.so*)。

我想创建一个共享库,比如 mylib.so,它使用了一些其他特殊库(在我的例子中是 intel mkl 和 openMP)。

没有问题1将英特尔 MKL 和 OpenMP 库静态链接到 mylib.so 中——您只是不想动态依赖这些库(换句话说,你要求的是一件你实际上并不需要的不可能的事情)。

为此,您需要做两件事:

  1. mylib.so 与您不想动态依赖的库的 归档 版本相关联,例如gcc -o mylib.so -shared mylib.c .../libmkl.a ...
  2. 您要静态链接到 mylib.so 的库必须使用与位置无关的代码(即带有 -fPIC 标志)构建。

1 请注意,在其他人的库中链接并分发它可能会涉及许可问题。