混合静态库和共享库时的链接器依赖关系

时间:2012-09-18 18:55:40

标签: c++ perl linker makefile xs

关于Linux的链接,我有以下问题:

假设我有一个使用Qt的类Foo。要构建这个类,我必须使用qmake来生成Makefile。

后来我想将这个类Foo用于Perl模块,这是一个共享库。但是,为了构建它,我必须使用Perl的MakeMaker来生成它自己的Makefile。

我现在正在这样做的方式是我将类Foo构建为静态库,并且在构建Perl模块的共享库时,我将它与Foo的静态库链接。

问题是,在构建Perl模块的共享库时,我必须将它与Foo的静态库链接的所有Qt库相链接。

所以问题是:

  1. 这种做法是否有意义?!

  2. 是否有可能以构建Perl模块的共享库时不必指定所有依赖项的方式构建Foo的静态库? (因为将所有这些依赖项添加到模块的Makefile中有点困难)

  3. 如果Foo的库是共享的,而不是静态的,它会有什么不同吗?

2 个答案:

答案 0 :(得分:2)

1)您无法将静态库与共享库链接。

2)如果Foo本身是DSO,则无需明确链接Foo的依赖关系

3)您可以轻松修改Makefile.PL LIBS部分以添加额外的链接器依赖项。

4)无论如何,Qt是静态链接的彻头彻尾的痛苦。除非你有特定的版本依赖性和操作系统/平台限制,否则你最好只做整个动态的shebang。提示:即使你有一个Qt的“静态”构建,这个“静态”构建也不会包含它可能决定需要作为可加载模块存在的东西。去过那里。

5)我相信有一个提供Qt4绑定的CPAN模块(有点近期)。我从来没有使用它,也不知道它的状态,但可能值得一试。

但最好的办法是让Foo成为一个充满活力的图书馆。大家都很开心。

答案 1 :(得分:1)

1)这取决于你的目标是什么。

2)如果它是最大限度地减少构建它的麻烦,你可以将Qt的静态库作为静态库包含在你的Foo库中。重要的是,您在Foo中引用的符号可以在运行时找到。这样你就不需要在你的PerlMake中包含Qt库了。

3)如果是关于最小化可执行文件大小,则必须使用共享库。然后你应该把所有东西都建成一个共享库。

静态构建具有独立于目标平台上已安装的共享库的优势,同时具有可执行大小膨胀和库的不可重用性的缺点(加载两个相同的可执行文件需要更多内存)。

链接到共享具有代码大小更小的优点,但同时必须在目标平台上安装正确的共享库。