关于Linux的链接,我有以下问题:
假设我有一个使用Qt的类Foo。要构建这个类,我必须使用qmake来生成Makefile。
后来我想将这个类Foo用于Perl模块,这是一个共享库。但是,为了构建它,我必须使用Perl的MakeMaker来生成它自己的Makefile。
我现在正在这样做的方式是我将类Foo构建为静态库,并且在构建Perl模块的共享库时,我将它与Foo的静态库链接。
问题是,在构建Perl模块的共享库时,我必须将它与Foo的静态库链接的所有Qt库相链接。
所以问题是:
这种做法是否有意义?!
是否有可能以构建Perl模块的共享库时不必指定所有依赖项的方式构建Foo的静态库? (因为将所有这些依赖项添加到模块的Makefile中有点困难)
如果Foo的库是共享的,而不是静态的,它会有什么不同吗?
答案 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)如果是关于最小化可执行文件大小,则必须使用共享库。然后你应该把所有东西都建成一个共享库。
静态构建具有独立于目标平台上已安装的共享库的优势,同时具有可执行大小膨胀和库的不可重用性的缺点(加载两个相同的可执行文件需要更多内存)。
链接到共享具有代码大小更小的优点,但同时必须在目标平台上安装正确的共享库。