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



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

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

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

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

配置.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

制作文件.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

程序似乎找不到头文件或源文件?

否,"未定义引用";是链接错误。这意味着链接器正在尝试解析函数调用,但没有看到函数的任何实现。这通常意味着链接命令行上指定的库存在问题。

事实上,Makefile.am中与链接相关的设置都是错误的,还有其他影响较小的问题。

首先,链接程序所需但未通过configure定位的库应通过LDADD变量或程序特定的foo_LDADD变量在Makefile.am中指定。foo_DEPENDENCIES变量不起这个作用——它的内容在生成的makefile中显示为程序目标的依赖项,但没有其他内容。特别是,它们不包括在链接命令行中。在实践中,很少使用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

最新更新