【问题标题】:Link .a library to .o object so only .o needs to be included when building将 .a 库链接到 .o 对象,因此在构建时只需要包含 .o
【发布时间】:2011-09-08 14:11:17
【问题描述】:

我正在使用一个名为“libdscud-6.02.a”的预构建库,其中包含许多针对某些特定硬件的低级 I/O 调用。由此,我创建了一些包装函数,并将其编译到一个名为“io.o”的目标文件中。

现在,我正在使用这些 I/O 函数编译一些程序,而不必这样做:

gcc libdscud-6.02a io.o -o test test.c

我想要这个:

gcc io.o -o test test.c

有什么方法可以将 .a 文件链接到 .o 文件中,所以我只需要在编译二进制文件时包含 .o 文件吗?

【问题讨论】:

  • 虽然正确的方法是-L . -ldscud-6.02,但真正的问题是你想要达到什么目的?为什么要减少前者对后者的调用?
  • 我正在做一个巨大的项目,其中有大量的小程序正在编译。如果我不必记住同时添加库和目标文件,它只会让它更容易一些。这似乎也有些多余,因为我永远不会只需要其中一个文件。
  • 看这个问题,我觉得基本一样:stackoverflow.com/q/4528635/12711
  • 使用合适的 Makefile 怎么样?!特别适合大型项目!
  • @psycho 我已经在使用 Makefile,但即使在 Makefile 中,我也需要为每个需要它的程序指定包含这两个文件。我想我可以使用下面发布的 make 变量,但我希望有一个更清洁的解决方案。

标签: c linux gcc makefile ld


【解决方案1】:

您可以做相反的事情并使用 ar 将 io.o 文件添加到 .a 文件中:

ar q libdscud-6.02.a io.o

【讨论】:

    【解决方案2】:

    一种解决方案是简单地使用make 变量:

    IO_STUFF = libdscud-6.02a io.o
    
    ...
    
    $(CC) $(IO_STUFF) ...
    

    【讨论】:

      【解决方案3】:

      AFAIK 无法链接 .a 库和 .o 文件来创建另一个中间文件,即没有像 .o 文件那样链接的文件。 Burton Samograd 提供的解决方案看起来是个不错的选择;但如果您不允许修改 .a 库文件,那么您可以遵循 DarkDust 提供的建议,以防您使用 make 进行构建。
      但是,您可以从 .a 库文件和 .o 文件创建共享库 .so 文件(我认为这就是 Michael Burr 试图传达的内容)。您只能使用共享库而不是 .a 和 .o 文件来生成可执行文件,如下所示:
      生成共享库gcc io.o libdscud-6.02.a -shared -o io.so(请注意传递给链接的文件顺序很重要)
      使用 gcc io.so -o test test.c 构建您的源代码。要执行 io.so 的可执行路径,应位于加载程序 (ld) 的查找路径中,即 LD_LIBRARY_PATH。
      使用共享对象的正确方法是创建一个libio.so,这是命名约定,不是io.so,并将代码构建为gcc test.c -o test -L<path_to_libio.so> -liolibio.so 的路径应该在 ld 中查找执行输出可执行文件的路径。
      我知道创建共享库只是为了避免添加另一个文件进行编译似乎不是你想要做的......但这只是为了你的信息,以防你还不知道:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多