【问题标题】:how to force linker to use shared library instead of static library?如何强制链接器使用共享库而不是静态库?
【发布时间】:2011-05-24 06:38:42
【问题描述】:

这是来自 Linux 编程书的引述:


% gcc -o app app.o -L. –ltest

假设libtest.alibtest.so都可用。那么链接器必须 选择其中一个库而不是另一个。链接器搜索每个目录(首先 那些用-L 选项指定的,然后是标准目录中的)。当 链接器找到包含libtest.alibtest.so 的目录,链接器停止 搜索目录。如果目录中只有两个变体之一,则链接器 选择该变体。否则,链接器选择共享库版本,除非 否则您明确指示它。您可以使用-static 选项来要求静态 档案。例如,以下行将使用 libtest.a 存档,即使 libtest.so 共享库也可用:

% gcc -static -o app app.o -L. –ltest


由于如果链接器遇到包含libtest.a 的目录,它会停止搜索并使用该静态库,如何强制链接器只搜索共享库而不搜索静态库?

% gcc -o app app.o -L. libtest.so?

【问题讨论】:

    标签: c++ linux unix shared-libraries


    【解决方案1】:

    来自男人:

    -shared-libgcc
    -static-libgcc
    在提供 libgcc 作为共享库的系统上,这些选项 分别强制使用共享或静态版本。 如果在编译器运行时没有构建 libgcc 的共享版本 配置后,这些选项无效。

    祝你好运

    【讨论】:

    • 这不只是针对 libgcc 的吗?它不能解决其他库的问题
    • 是的,那是我的错。你可以写 libname.so 来链接它,就像 kobac 说的那样,谢谢你的更正
    【解决方案2】:

    如果您的链接器支持,您可以使用 -l:filename 形式的 -l 选项(旧版本的 ld 不支持)

    gcc -o app app.o -L. -l:libtest.so
    

    其他选项是直接使用文件名而不使用-l-L

    gcc -o app app.o /path/to/library/libtest.so
    

    【讨论】:

    • 注意:-l 的这种使用是无证的。它将在可执行文件中包含库的完整路径,这意味着库永远不能从其当前位置移动。
    • @KevinPanko -l 选项记录在man ldlinux.die.net/man/1/ld - 我不能轻易测试它,但根据文档:如果namespec 的形式为:filenameld 将在库路径中搜索名为 filename 的文件。就像我提到的,旧版本的 ld 不支持此选项。
    • 我在这里查看gcc 的文档:Options for Linking
    • 好吧,它没有提到任何版本——gcc 和 ld 都没有。使用man ld 将向您显示与您的链接器版本相关的文档。
    • -l:filename 在我们需要使用静态库时也很有用
    猜你喜欢
    • 2023-04-04
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多