使用我自己的 static/dinamic 库:如何编译和 link 反对(正确做事的正确方法)

using my own static/dinamic library: HOW TO compile and link against (the right way to do the things properly)

抱歉这个新手问题。

上下文:

我刚刚创建了自己的库(使用 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

问题:

为了能够 link 再次使用 -lmyownsomething,您需要 libmyownsomething.so(或 .a,对于静态 linking ) 在您 linker 默认搜索的目录之一中。

我在 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)使用默认的 linker 脚本 ,可以通过 --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 构建时间选项。然后 user/packager 可以决定最好的放置它们自己的地方。但是没有什么能阻止你提供合理的默认值。图书馆也是如此,但我试图准确地解决问题的那一部分。)

一般来说,这个东东因系统而异,但一般都跟在Filesystem Hierarchy Standard之后。我认为,/usr/include/usr/lib 是最安全的选择。另一个好的做法是使用例如pkgconf机制。

希望这对您有所帮助。我真的应该先问问您的 use-case:您打算将软件分发给谁,如何分发?总之,一定要post评论。另外,我想知道这是否是 Whosebug material;也许它需要搬到其他地方。