使用我自己的 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
问题:
文件应该放在哪里? (我客人/usr/local/include/
和/usr/local/lib/
如何通过仅插入 #include <myownsomething.h>
和一个正确的标志 LDFLAGS=-lmyownsomething
来针对这个编译其他 lib/projects?
为了能够 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");
要回答有关 #include
ing 文件的问题,您需要查阅编译器文档,或者可能是 POSIX 标准。 (但是,我建议要么选择最简单的选择——见下文——要么提供一种可配置的方式来安装你的文件,例如使用 --prefix
构建时间选项。然后 user/packager 可以决定最好的放置它们自己的地方。但是没有什么能阻止你提供合理的默认值。图书馆也是如此,但我试图准确地解决问题的那一部分。)
一般来说,这个东东因系统而异,但一般都跟在Filesystem Hierarchy Standard之后。我认为,/usr/include
和 /usr/lib
是最安全的选择。另一个好的做法是使用例如pkgconf
机制。
希望这对您有所帮助。我真的应该先问问您的 use-case:您打算将软件分发给谁,如何分发?总之,一定要post评论。另外,我想知道这是否是 Whosebug material;也许它需要搬到其他地方。
抱歉这个新手问题。
上下文:
我刚刚创建了自己的库(使用 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
问题:
文件应该放在哪里? (我客人
/usr/local/include/
和/usr/local/lib/
如何通过仅插入
#include <myownsomething.h>
和一个正确的标志LDFLAGS=-lmyownsomething
来针对这个编译其他 lib/projects?
为了能够 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");
要回答有关 #include
ing 文件的问题,您需要查阅编译器文档,或者可能是 POSIX 标准。 (但是,我建议要么选择最简单的选择——见下文——要么提供一种可配置的方式来安装你的文件,例如使用 --prefix
构建时间选项。然后 user/packager 可以决定最好的放置它们自己的地方。但是没有什么能阻止你提供合理的默认值。图书馆也是如此,但我试图准确地解决问题的那一部分。)
一般来说,这个东东因系统而异,但一般都跟在Filesystem Hierarchy Standard之后。我认为,/usr/include
和 /usr/lib
是最安全的选择。另一个好的做法是使用例如pkgconf
机制。
希望这对您有所帮助。我真的应该先问问您的 use-case:您打算将软件分发给谁,如何分发?总之,一定要post评论。另外,我想知道这是否是 Whosebug material;也许它需要搬到其他地方。