gpt4 book ai didi

c++ - 将一个共享库静态链接到我的共享库

转载 作者:IT王子 更新时间:2023-10-29 00:56:52 24 4
gpt4 key购买 nike

我正在为我目前正在进行的项目的一些链接选项而苦苦挣扎:

我正在尝试创建一个与其他 2 个库链接的共享库。 (我们称它们为 libfoo.solibbar.so)
我的输出库必须是共享库,我想将 libfoo.so 静态链接到生成的库,但 libbar.so 应该作为动态库链接。 (libbar.so 应该在每台机器上都可用,其中 libfoo.so 不可用,我不希望用户安装它/将它与我的二进制文件一起发送。)

我该如何存档?

我当前的构建指令如下所示:

c++ -Wall -shared -c -o src/lib.o src/lib.cpp
c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar

我的辩护:我不是 c/c++ 专家,如果这个问题看起来很愚蠢,我很抱歉。

最佳答案

有两种 Linux C/C++ 库类型。

  • 静态库 (*.a) 是目标代码的存档,它们与应用程序链接并成为应用程序的一部分。它们是使用 ar(1) 命令创建的,并且可以使用它们进行操作(即 ar -t libfoo.a 将列出库/存档中的文件)。

  • 动态链接的共享对象库 (*.so) 有两种使用方式。

    1. 共享对象库可以在运行时动态链接,但静态感知。这些库在编译/链接阶段必须可用。共享对象不包含在二进制可执行文件中,但与执行相关联。
    2. 可以使用动态链接加载器系统函数在执行期间动态加载/卸载和链接共享对象库。

为了将 libfoo.so 静态链接到您的二进制文件中,您需要一个相应的静态库,通常称为 libfoo.a。在创建程序可执行文件时,您可以通过调用静态库作为编译和链接过程的一部分来使用它。

结果会将您的构建命令更改为如下所示:

g++ -Wall -fPIC -c -o src/lib.o src/lib.cpp
g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1 src/lib.o -L/path/to/library-directory -lbar libfoo.a

关于c++ - 将一个共享库静态链接到我的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2858724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com