【问题标题】:using my own static/dinamic library: HOW TO compile and link against (the right way to do the things properly)使用我自己的静态/动态库:如何编译和链接(正确做事的正确方法)
【发布时间】:2019-06-18 13:45:53
【问题描述】:
抱歉这个新手问题。
上下文:
我刚刚创建了自己的库(使用 CMake):
libmyownsomething.a <--- static version of the compiled library
libmyownsomething.so <--- dinamic version of the same library
libmyownsomething.h <--- the header file to be included in other project
问题:
【问题讨论】:
标签:
gcc
linker
shared-libraries
static-libraries
lib
【解决方案1】:
为了能够仅使用-lmyownsomething 再次链接您的库,您需要在链接器默认搜索的目录之一中拥有libmyownsomething.so(或.a,用于静态链接)。
我在 GNU ld (library search path in linker script) 的 texinfo 文档中找到了这个:
'SEARCH_DIR(PATH)'
The 'SEARCH_DIR' command adds PATH to the list of paths where 'ld'
looks for archive libraries. Using 'SEARCH_DIR(PATH)' is exactly
like using '-L PATH' on the command line
现在,GNU ld(准确地说是ld.bfd)使用默认的链接器脚本,可以通过--verbose 获得。让我们看看默认情况下有哪些搜索目录(无论如何,在我的系统上——这很可能取决于配置;如果你要分发你的库,你可能想要做出最便携的选择):
$ ld --verbose |& grep SEARCH_DIR
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib");
要回答有关#includeing 文件的问题,您需要查阅编译器文档,或者可能是POSIX 标准。 (但是,我建议使用最简单的选择——见下文——或者提供一种可配置的方式来安装文件,例如使用--prefix 构建时间选项。然后用户/打包者可以决定放置它们的最佳位置为他们自己。但没有什么能阻止你提供健全的默认值。图书馆也是如此,但我试图准确地解决这部分问题。)
通常,这些东西因系统而异,但它们通常遵循Filesystem Hierarchy Standard。我认为,/usr/include 和/usr/lib 是最安全的选择。另一个好的做法是使用例如pkgconf 机制。
希望这会有所帮助。我真的应该首先询问您的用例:您要将软件分发给谁,以及如何分发?无论如何,请务必发布 cmets。另外,我想知道这是否是 Stackoverflow 材料;也许它需要搬到其他地方。