如何静态 link 库以构建共享库

How to statically link a library in order to build a shared library

我正在尝试在 Ubuntu Linux 中构建一个依赖于 libusb 的共享库。

我想在 libusb 中静态 link 到我的共享库中。

现在,将 libusb 构建为静态库。

现在,当我尝试 link 它进入我的共享库时,linker 给出了一个错误,说我应该使用 -fPIC 标志构建 libusb。

很公平。

所以我用 -fPIC 构建了 libusb - 但后来我注意到 .so 的大小明显变小了,大概是因为它不再创建静态库。

但是,我能够使用 -fPIC 版本的 libusb 成功构建我的共享库。

但是,当我的应用程序尝试加载我的共享库时,动态加载程序给出以下错误:

符号查找错误:未定义符号:udev_new

不知何故,我想静态 link libusb 到我的共享库中以避免这些类型的符号查找错误,但我找不到正确的 gcc 构建选项组合。

有人可以帮忙解决这个问题吗?

谢谢。

问题可能是当您在 libusb.a 库中 link 时,只有共享库中使用的 libusb 中的符号才会 link 编辑到您的共享对象中。

要解决这个问题,请使用 --whole-archive linker 标志。 不要简单地使用 -lusb,而是使用

 -Wl,--whole-archive -lusb -Wl,--no-whole-archive