如何使用 autotools 构建静态和共享库?

How to build static and shared library with autotools?

我正在学习使用 Autotools。我正在使用这些工具编写我的第一个程序,但我遇到了问题。我正在尝试制作使用两个库的程序:一个静态库和一个共享库。我配置了Makefile.amconfigure.ac,不知道是不是应该的。当我 运行 命令 make 时,它 returns 一个错误:

code.c:37: undefined reference to `function1'.

它为每个函数都给出了这样的错误。程序好像找不到头文件或源文件?

我的所有文件都在一个文件夹中。

configure.ac

AC_PREREQ([2.69])
AC_INIT([code], [1.0])
LT_INIT
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([code.c])
AC_CONFIG_MACRO_DIRS([m4])
AC_PROG_CC 
AC_CHECK_HEADERS([stdio.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am

ACLOCAL_AMFLAGS = -I m4

bin_PROGRAMS = code
code_SOURCES = code.c libcodes.la libcode.a libo.h libp.h

lib_LIBRARIES = libcode.a
libcode_a_SOURCES = functionsp.c

code_DEPENDENCIES = libcodes.la
lib_LTLIBRARIES = libcodes.la
libcodes_la_SOURCES = functionso.c
libcodes_la_LDFLAGS = -version-info 1:0:0
code_LDFLAGS = -rpath /usr/local/lib

It seems that the program can't find headers or source files?

不,“未定义引用”是一个 link 错误。这意味着 linker 正在尝试解析函数调用,但它没有看到该函数的任何实现。这通常表示 link 命令行中指定的库存在问题。

确实,您 Makefile.am 中与 link 相关的设置都是错误的,还有其他影响较小的问题。

首先,link 程序所需的库,但不通过 configure 定位,应通过 LDADD 变量或程序特定的程序在 Makefile.am 中指定foo_LDADD 变量。 foo_DEPENDENCIES 变量不用于此目的——它的内容作为程序目标的依赖项出现在生成的 makefile 中,但没有出现在其他任何地方。特别是,它们不包含在 link 命令行中。实际上,很少使用foo_DEPENDENCIES变量。

库尤其不应指定为程序源。它们不是来源,这样指定它们没有任何用处。

说到库,将一个假定的库安装目录硬编码到您的 Makefile.am 中是一种糟糕的形式,并且会给自己带来问题,因为该目录可以由用户在 configure 和/或make 次。幸运的是,每个可配置的安装目录都有一个相应的变量供您参考。在 lib 的情况下,它是 libdir

此外,作为一种风格问题,您似乎围绕构建阶段组织了您的 Makefile.am,但这很不寻常,至少我觉得很难遵循。 Makefile.am 文件通常围绕命名的目标进行组织,通常首先指定所有这些目标。

总的来说,您可能想要这样的东西:

ACLOCAL_AMFLAGS = -I m4

bin_PROGRAMS = code
lib_LIBRARIES = libcode.a
lib_LTLIBRARIES = libcodes.la

code_SOURCES = code.c libo.h libp.h
code_LDFLAGS = -rpath $(libdir)
code_LDADD = libcodes.la libcode.a
# or LDADD = libcodes.la libcode.a

libcode_a_SOURCES = functionsp.c

libcodes_la_SOURCES = functionso.c
libcodes_la_LDFLAGS = -version-info 1:0:0