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

Gcc 我如何告诉ld忽略丢失的库?,gcc,linker,ld,Gcc,Linker,Ld,我想为一组可执行文件定义一个带有隐式规则的Makefile,其中一些需要针对定制库进行链接(我们称之为libedich.a) 我的问题是,我希望能够构建那些不需要libedich.a的可执行文件,而libedich.a尚未构建。如果我只是简单地将-ledich添加到LDLIBS变量中,当libedich.a不存在时,我会得到错误: /usr/bin/ld: cannot find -ledich 当给定库不存在时,我如何告诉ld可以继续链接?这是使用一个LDLIBS变量保存所有库依赖项并对每个

我想为一组可执行文件定义一个带有隐式规则的Makefile,其中一些需要针对定制库进行链接(我们称之为
libedich.a

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

/usr/bin/ld: cannot find -ledich

当给定库不存在时,我如何告诉ld可以继续链接?

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

  • 可能有一些奇特的IDE和构建工具试图从上下文推断库依赖关系,从而避免您为每个目标手动指定它们
  • 切换到使用共享库
  • 修复Makefile中的目标,使其依赖于libedich.a(即使它不需要)。如果您正在构建所有内容,并且不关心目标的顺序,那么这将起作用
  • 为Makefile中的每个目标手动指定库依赖项
最后一个选择是我的建议;这是更多的工作,但消除Makefile中的错误依赖项将使您能够构建(可能是大部分)目标,即使其中一个依赖项被破坏。一种方便的方法是使用特定于目标的变量:

targetname::LDLIBS+=-ledich

您可能还想知道
make--keep-going
make-k

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

# create an empty archive.
ar cru libedich.a
或者更简单一点

echo '!<arch>' >libedich.a
echo'!'>利伯迪

你没有。您将学习使用自动工具根据可用资源生成makefile。