【问题标题】:How to set LDFLAGS for a "noinst" kind of library with Automake?如何使用 Automake 为“noinst”类型的库设置 LDFLAGS?
【发布时间】:2012-11-29 12:01:07
【问题描述】:

假设我开发了 libfoo.a 作为编译过程的中间步骤。这是 Makefile.am 中的一行:

noinst_LIBRARIES = libfoo.a

这个库依赖于其他库。为了防止我得到未定义的引用错误,我需要设置它的 LDFLAGS 变量。这是我所做的:

libfoo_a_LDFLAGS = `pkg-config --ldflags some_lib`

但是,automake 失败并显示以下消息:

variable `libfoo_a_LDFLAGS` is defined but no program or library has `libfoo_a` as canonical name (possible typo)

我在这里做错了什么?它适用于 libfoo_a_SOURCES_CFLAGS

【问题讨论】:

  • 你不应该在 make 时运行 pkg-config:它应该在配置时通过 PKG_CHECK_MODULES 运行(如果使用的话)。
  • 为什么不将适当的库添加到构建时与 libfoo 链接的可执行文件的 LDFLAGS 中?

标签: automake ldflags


【解决方案1】:

使用简单的 *.a 中间库是不可能做到这一点的。那是因为中间库永远不会链接,所以LDFLAGS 对它没有意义。中间库只是一个 ar 档案,它只是一个目标文件的集合。 ar 档案没有地方记录需要用于链接最终对象的标志。

通常的解决方案是按照 William Pursell 的建议:将必要的 LDFLAGS 添加到您在构建过程中创建的最终可执行文件或共享库中。

另一种可能性是将您的中间库构建为 libtool *.la 库,即使您只是将它们用作中间库。当您这样做时,构建系统将生成一个共享对象(您最终不会使用它,因为您会将底层对象文件组合到您的实际构建工件中),但更重要的是它将创建一个 *.la 文件,它有一个地方记录这种依赖信息。 Automake 手册称其为“Libtool 便利库”。为此,您当然必须使用 libtool,并切换到在您的 Makefile.am 中调用此 libfoo.la 并在 noinst_LTLIBRARIES 中列出它。但除非你已经在使用 libtool,否则这可能会带来更多麻烦。

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 2011-08-29
    • 1970-01-01
    • 2020-11-18
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多