【问题标题】:Can I mix static and shared-object libraries when linking?链接时可以混合使用静态库和共享对象库吗?
【发布时间】:2011-02-26 14:49:42
【问题描述】:

我有一个生成十个可执行文件的 C 项目,我希望将所有这些文件都静态链接。我面临的问题是其中一个可执行文件使用了只有共享对象版本可用的第 3 方库。

如果我将-static 标志传递给gcc,ld 将出错,说它找不到有问题的库(我认为它正在寻找.a 版本)并且不会构建可执行文件。理想情况下,我希望能够告诉“ld”尽可能多地静态链接,如果找不到静态库,则故障转移到共享对象库。

在中间阶段,我尝试了类似gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe 的方法,希望“ld”能够静态链接到 lib1 和 lib2,但仅在运行时依赖于 lib3rdparty。不幸的是,这并没有按我的预期工作。相反,-shared 标志覆盖了-static 标志,所有内容都被编译为共享对象。

是静态链接全有或全无的交易,还是有什么方法可以混合搭配?

【问题讨论】:

    标签: c gcc static linker


    【解决方案1】:

    this thread就可以了。 GNU 的人建议

    gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe
    

    【讨论】:

    • “-Wl,-Bstatic 之后的库列表中是否缺少“-l”前缀;应该是:-Wl,-Bstatic -llib2 -llib2 -llib3 ???
    • @HestonT.Holtmann 这是隐含的,但我会修复它以便更清楚。
    • @Anthony 如何对 LDFLAGS 做同样的事情?
    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 2010-11-17
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多