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

标签 ubuntu makefile autotools automake libtool

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

最佳答案

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


不,“ undefined reference ”是链接错误。这意味着链接器正在尝试解析函数调用,但它没有看到该函数的任何实现。这通常暗示链接命令行上指定的库存在问题。
事实上,Makefile.am 中的链接相关设置都是错误的,还有其他影响较小的问题。
首先,链接程序所需的库,但不是通过 configure 找到的。应在 Makefile.am 中指定通过 LDADD变量或程序特定 foo_LDADD多变的。一个 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

关于ubuntu - 如何使用自动工具构建静态和共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67628689/

相关文章:

自动工具临时文件

c - 如何在 autotools 中为 C 项目定义宏?

vmware - 使用 libtool 而不使用链接

php - Linux apache 中 php 文件的根路径

ubuntu - Visual Studio 代码 clang 可执行文件

makefile - 如果过时,则防止仅重新构建订单先决条件

c++ - GNU MAKE - 从我自己的 Makefile 创建 getoptpp 库或为 c++ 建议命令行选项库

java - Java 应用程序的 Linux 启动脚本

ubuntu - 监控并重启服务器上的 Dart 进程

c - 为检查测试 C 框架构建库