Ubuntu 如何静态链接库以构建共享库

Ubuntu 如何静态链接库以构建共享库,ubuntu,gcc,udev,Ubuntu,Gcc,Udev,我正试图在Ubuntu Linux中构建一个依赖于libusb的共享库 我想将libusb静态链接到我的共享库中 现在,我们将libusb构建为一个静态库 现在,当我尝试将它链接到我的共享库时,链接器给出一个错误,说我应该使用-fPIC标志构建libusb 很公平 所以我用-fPIC构建了libusb,但后来我注意到.So的大小明显变小了,大概是因为它不再创建静态库了 但是,我成功地用libusb的-fPIC版本构建了我的共享库 但是,当我的应用程序尝试加载我的共享库时,动态加载程序会出现以下错

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

我想将libusb静态链接到我的共享库中

现在,我们将libusb构建为一个静态库

现在,当我尝试将它链接到我的共享库时,链接器给出一个错误,说我应该使用-fPIC标志构建libusb

很公平

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

但是,我成功地用libusb的-fPIC版本构建了我的共享库

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

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

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

有人能帮忙解决这个问题吗


谢谢。

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

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

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

我没有使用-lusb。我已经从libusb源代码构建了自己的.a文件,并在我的cmake脚本中链接到该文件。目标链接库(xxx libusb-1.0.a),然后您可以运行
make VERBOSE=1
,查看正在运行哪些命令。如果在链接阶段不使用-lusb,命令只声明“libusb-1.0.a”(可能包括完整路径),则需要使cmake发出
-Wl,-whole archive libusb-1.0.a-Wl,-而不是整个归档文件
,尽管我不知道如何执行。我让cmake发出了该命令,但仍然得到相同的错误。请注意,我没有使用-fPIC.ok构建libusb-1.0.a-我可能也误读了您的未定义符号,
udev_new
,它位于libudev库中,而不是libusb,因此您还需要将应用程序链接到
-ludev
。也许你也可以将你的共享库链接到
-ludev
,尽管新的工具链可能会忽略这一点,并迫使你在链接应用程序时使用
-ludev
,至少没有其他选项。我不能使用-ludev,因为我希望能够构建x64、x86、,和来自同一生成机器的arm64二进制文件(使用不同的编译器)。因此,我必须在单个静态库中使用所有生成的代码构建libusb,以便我可以使用它来构建我的共享库。