【问题标题】: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

问题

  • 应该放置文件的正确位置在哪里? (我客人/usr/local/include//usr/local/lib/

  • 如何通过仅插入#include &lt;myownsomething.h&gt; 和一个正确的标志LDFLAGS=-lmyownsomething 来针对这个编译其他库/项目?

【问题讨论】:

    标签: 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 材料;也许它需要搬到其他地方。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2012-04-14
      • 2013-08-04
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多