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

Ubuntu 如何使用autotools构建静态和共享库?,ubuntu,makefile,autotools,automake,libtool,Ubuntu,Makefile,Autotools,Automake,Libtool,我正在学习使用自动工具。我正在用这些工具编写我的第一个程序,但我有一个问题。我正在尝试制作一个使用两个库的程序:一个是静态库,另一个是共享库。我配置了Makefile.am和configure.ac,但我不知道它们是否应该是这样。当我运行命令make时,它返回一个错误: 它为每个函数都提供了这样的错误。程序似乎找不到头文件或源文件 我的所有文件都在一个文件夹中 配置.ac Makefile.am 程序似乎找不到头文件或源文件 否,“未定义引用”是链接错误。这意味着链接器正在尝试解析函数调用,但没

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

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

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

配置.ac Makefile.am 程序似乎找不到头文件或源文件

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

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

首先,链接程序所需但未通过
configure
定位的库应通过
LDADD
变量或特定于程序的
foo\u LDADD
变量在
Makefile.am
中指定。
foo_DEPENDENCIES
变量不起此作用——它的内容作为程序目标的依赖项出现在生成的makefile中,而不是其他地方。特别是,它们不包括在链接命令行中。实际上,很少使用
foo_依赖项
变量

尤其不应将库指定为程序源。它们不是源,将它们指定为源不会产生任何有用的效果

说到库,将假定的库安装目录硬编码到
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

它起作用了!谢谢你的帮助和很多有用的信息。我很乐意帮忙,@2221。按照惯例,当他们的问题得到满意的回答时,OP会通过点击分数旁边的复选标记来“接受”其中一个答案。哦,谢谢。我不知道,但已经做了。
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
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
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