如何告诉ld忽略丢失的库?

时间:2011-10-22 23:49:47

标签: gcc linker ld

我想为一堆可执行文件定义一个包含隐式规则的Makefile,其中一些需要链接到一个自定义构建的库(让我们称之为libedich.a)。

我的问题是,我希望能够构建那些不需要libedich.a的可执行文件,而后者尚未构建。如果我只是将-ledich添加到LDLIBS变量,则在libedich.a不存在时会出现错误:

/usr/bin/ld: cannot find -ledich

如果给定的库不存在,我怎么告诉ld可以继续链接?

2 个答案:

答案 0 :(得分:3)

一个常见的解决方案是创建一个虚拟档案,以便GCC找到它。由于可执行文件不需要库中的任何符号,因此不会出错。像这样,

# create an empty archive.
ar cru libedich.a

甚至更简单,

echo '!<arch>' >libedich.a

答案 1 :(得分:0)

这是使用一个LDLIBS变量来保存所有库依赖项并为每个目标重用它的缺点,即使您知道某些目标只需要库的子集。您有几种选择:

  • 可能有花哨的IDE和构建工具尝试从上下文推断库依赖关系,从而避免为每个目标手动指定它们。
  • 切换到使用共享库。
  • 修复Makefile中的目标,使其依赖于libedich.a(即使它不需要)。如果您正在构建所有内容并且不关心目标的顺序,这将有效。
  • 手动为Makefile中的每个目标指定库依赖项。

最后一个选项是我的建议;这是更多的工作,但消除Makefile中的错误依赖将使您能够构建(可能大部分)您的目标,即使其中一个依赖项被破坏。一种方便的方法是使用特定于目标的变量:

targetname::LDLIBS+=-ledich

您可能还想了解make --keep-goingmake -k