链接时可以混用静态和共享对象库吗?

时间:2010-06-02 01:09:37

标签: c gcc static linker

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

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

在interium中我尝试了类似gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe的东西,希望'ld'在lib1和lib2中静态链接,但只对lib3rdparty有运行时依赖。不幸的是,这不符合我的意图;相反,-shared标志覆盖了-static标志,所有内容都被编译为共享对象。

是静态链接一个全有或全无的交易,还是有某种方式我可以混合搭配?

1 个答案:

答案 0 :(得分:63)

查看this thread您可以看到它可以完成。 GNU的人建议

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