如何使用自动工具构建静态和共享库?

Posted

技术标签:

【中文标题】如何使用自动工具构建静态和共享库?【英文标题】:How to build static and shared library with autotools? 【发布时间】:2021-05-20 22:21:25 【问题描述】:

我正在学习使用 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

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 通过单击其分数旁边的复选标记“接受”其中一个答案。 哦,谢谢。我不知道,但已经这样做了。

以上是关于如何使用自动工具构建静态和共享库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“clang-win”工具集构建调试提升静态库?

如何在 Eclipse CDT 的共享库项目中使用静态库

Linux 静态库和共享(动态)库的创建与使用详解

Linux共享库静态库动态库详解

如何在 Linux 上将 googleTest 设置为共享库

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用