问题描述
是否可以创建一个本身静态链接的共享库,即它不依赖于其他共享库?
让我更具体一点..
我想创建一个共享库,比如 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
中——您只是不想动态依赖这些库(换句话说,你要求的是一件你实际上并不需要的不可能的事情)。
为此,您需要做两件事:
- 将
mylib.so
与您不想动态依赖的库的 归档 版本相关联,例如gcc -o mylib.so -shared mylib.c .../libmkl.a ...
- 您要静态链接到
mylib.so
的库必须使用与位置无关的代码(即带有-fPIC
标志)构建。
1 请注意,在其他人的库中链接并分发它可能会涉及许可问题。