如何使用自动工具构建静态和共享库?
Posted
技术标签:
【中文标题】如何使用自动工具构建静态和共享库?【英文标题】:How to build static and shared library with autotools? 【发布时间】:2021-05-20 22:21:25 【问题描述】:我正在学习使用 Autotools。我正在使用这些工具编写我的第一个程序,但我遇到了一个问题。我正在尝试制作使用两个库的程序:一个是静态的,一个是共享的。我配置了Makefile.am
和configure.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
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
【问题讨论】:
【参考方案1】:程序好像找不到头文件或源文件?
不,“未定义的引用”是链接错误。这意味着链接器正在尝试解析函数调用,但它没有看到该函数的任何实现。这通常意味着链接命令行上指定的库存在问题。
确实,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
【讨论】:
有效!感谢您的帮助和很多有用的信息。 我很高兴为您提供帮助,@crocodile2221。按照惯例,当他们的问题得到满意的回答时,OP 通过单击其分数旁边的复选标记“接受”其中一个答案。 哦,谢谢。我不知道,但已经这样做了。以上是关于如何使用自动工具构建静态和共享库?的主要内容,如果未能解决你的问题,请参考以下文章