使用我自己的静态/动态库:如何编译和链接(正确执行操作的正确方法)

问题描述 投票:0回答:1

上下文

我刚刚创建了自己的库(使用 CMake):

libmyownsomething.a <--- static version of the compiled library
libmyownsomething.so <--- dynamic 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
    来针对此编译其他库/项目?

gcc linker shared-libraries static-libraries
1个回答
1
投票

为了能够仅使用

-lmyownsomething
再次链接到您的库,您需要在链接器默认搜索的目录之一中包含
libmyownsomething.so
(或
.a
,用于静态链接)。

我在 GNU ld 的 texinfo 文档中找到了这个(链接器脚本中的库搜索路径):

'SEARCH_DIR(路径)'

 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");

要回答有关

#include
ing 文件的问题,您需要查阅编译器文档,或者可能是 POSIX 标准。 (但是,我建议使用最简单的选择 - 见下文 - 或者提供一种可配置的方式来安装文件,例如使用
--prefix
构建时间选项。然后用户/打包者可以决定放置它们的最佳位置但没有什么可以阻止你提供合理的默认值。对于库来说也是如此,但我试图准确地解决问题的这一部分。)

一般来说,这些东西因系统而异,但它们通常遵循文件系统层次结构标准。 我认为,

/usr/include
/usr/lib
是最安全的选择。另一个好的做法是使用例如
pkgconf
机制。

希望这有帮助。我真的应该首先询问您的用例:您打算将软件分发给谁以及如何分发?不管怎样,一定要发表评论。另外,我想知道这是否是 Stackoverflow 的材料;也许它需要搬到其他地方。

© www.soinside.com 2019 - 2024. All rights reserved.