4

假设我开发了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

4

1 回答 1

5

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

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

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

于 2013-03-17T07:00:47.933 回答