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

发布于 2024-12-11 07:14:57 字数 353 浏览 0 评论 0原文

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

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

/usr/bin/ld: cannot find -ledich

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

I'd like to define a Makefile with implicit rules for a bunch of executables, some of which require linking against a custom-built library (let's call it libedich.a).

My problem is that I'd like to be able to build those executables that do not require libedich.a when the latter hasn't been built yet. If I simply add -ledich to the LDLIBS variable, I get errors when libedich.a doesn't exist:

/usr/bin/ld: cannot find -ledich

How do I tell ld that it's okay to continue linking when a given library doesn't exist?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

深巷少女 2024-12-18 07:14:57

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

# create an empty archive.
ar cru libedich.a

或者更简单,

echo '!<arch>' >libedich.a

A common solution is to create a dummy archive so that GCC will find it. Since the executable doesn't need any symbols from the library, it won't error out. Like this,

# create an empty archive.
ar cru libedich.a

or even simpler,

echo '!<arch>' >libedich.a
和影子一齐双人舞 2024-12-18 07:14:57

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

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

最后一个选项是我的推荐;这需要更多的工作,但是消除 Makefile 中的错误依赖关系将使您能够构建(也许是大部分)目标,即使其中一个依赖关系已损坏。一种方便的方法是使用特定于目标的变量:

targetname::LDLIBS+=-ledich

您可能还想了解 make --keep-going (make -k)

This is the downside of using one LDLIBS variable to hold all of the library dependencies and re-using it for every target, even though you know some targets only need a subset of the libraries. You have several options:

  • There are probably fancy IDE's and build tools out there that try to infer library dependencies from context, saving you from manually specifying them for each target.
  • Switch to using shared libraries.
  • Fix the target in your Makefile so that it depends on libedich.a (even if it doesn't need to). This will work if you are building everything anyway and don't care what order the targets proceed in.
  • Manually specify the library dependencies for each target in your Makefile.

The last option is my recommendation; it is more work, but eliminating the false dependencies in your Makefile will enable you to build (perhaps most of) your targets even if one of the dependencies is broken. One convenient way to do this is with target-specific variables:

targetname::LDLIBS+=-ledich

You probably also want to be aware of make --keep-going (make -k)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文