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