包括使用 automake 和 autoconf 的动态库

Posted

技术标签:

【中文标题】包括使用 automake 和 autoconf 的动态库【英文标题】:Including dynamic libraries using automake and autoconf 【发布时间】:2012-03-05 00:48:00 【问题描述】:

我正在尝试为我在 Linux 上使用 C++ 制作的简单 3D 游戏包含一些动态库(.so 文件)。这些动态库用于使用 Bullet 物理引擎。

我对如何使用 automake 和 autoconf 的了解非常有限,因此非常感谢任何帮助。

如何修改以下任何文件以包含这些动态库?

这是我的 makefile.am:

noinst_HEADERS= BaseApplication.h Physics.h GameApplication.h

bin_PROGRAMS= OgreApp
OgreApp_CPPFLAGS= -I$(top_srcdir)
OgreApp_SOURCES= BaseApplication.cpp Physics.cpp GameApplication.cpp
OgreApp_CXXFLAGS= $(OGRE_CFLAGS) $(OIS_CFLAGS)
OgreApp_LDADD= $(OGRE_LIBS) $(OIS_LIBS)

EXTRA_DIST = buildit makeit
AUTOMAKE_OPTIONS = foreign

这是我的 configure.ac:

AC_INIT(configure.ac)
AM_INIT_AUTOMAKE(SampleApp, 0.1)
AM_CONFIG_HEADER(config.h)

AC_LANG_CPLUSPLUS
AC_PROG_CXX
AM_PROG_LIBTOOL

PKG_CHECK_MODULES(OGRE, [OGRE >= 1.2])
AC_SUBST(OGRE_CFLAGS)
AC_SUBST(OGRE_LIBS)

PKG_CHECK_MODULES(OIS, [OIS >= 1.0])
AC_SUBST(OIS_CFLAGS)
AC_SUBST(OIS_LIBS)

AC_CONFIG_FILES(Makefile)
AC_OUTPUT

我还有一个 buildit 文件,它可以让所有东西都运行起来:

#!/bin/sh
rm -rf autom4te.cache
libtoolize --force --copy &&  aclocal &&  autoheader &&  automake --add-missing --force-missing --copy --foreign &&  autoconf
./configure && ./makeit

【问题讨论】:

你的 buildit 脚本太复杂了。不要显式调用 libtoolize、aclocal 等。相反,只需调用 autoreconf -i 您对 AC_INIT 的使用已经过时了。在现代 autoconf 中,AC_INIT 应该采用 3 个参数:项目名称、版本、联系点。您使用的是什么版本的 autoconf? AM_PROG_LIBTOOL 不应再使用。请改用 LT_INIT。 【参考方案1】:

对于 Bullet,您的系统上应该安装了一个 bullet.pc 文件,您可以将其与 autocong 宏 PKG_CHECK_MODULES 一起使用,与包含 OGRE 和 OIS 的方式相同:

# in configure.ac 
PKG_CHECK_MODULES(BULLET, [bullet])

# in Makefile.am
OgreApp_CXXFLAGS= $(OGRE_CFLAGS) $(OIS_CFLAGS) $(BULLET_CFLAGS)
OgreApp_LDADD= $(OGRE_LIBS) $(OIS_LIBS) $(BULLET_LIBS)


如果您添加更多无条件依赖项,您可能希望通过将这两个文件分组来简化它们,如下所示:
# in configure.ac 
PKG_CHECK_MODULES(DEPENDENCIES, [OGRE >= 1.2 OIS >= 1.0 bullet])

# in Makefile.am
OgreApp_CXXFLAGS= $(DEPENDENCIES_CFLAGS)
OgreApp_LDADD= $(DEPENDENCIES_LIBS)

正如 Jack Kelly 在 cmets 中所写,如果您的 pkg-config >= 0.24(2010 年发布),则无需在 PKG_CHECK_MODULE 之后使用 AC_SUBST

【讨论】:

不要AC_SUBSTPKG_CHECK_MODULES设置的变量,已经为你做好了。【参考方案2】:

在你的Makefile.am

OgreApp_LIBADD= -llib1 -llib2

这有帮助吗?

编辑:或尝试将-llib1 -llib2 附加到OgreApp_LDADD=... 行,我自己不确定。

【讨论】:

尝试 OgreApp_LDADD 会导致错误。像这样将文件添加到 LDADD: OgreApp_LDADD= $(OGRE_LIBS) $(OIS_LIBS) /usr/local/lib/libBulletCollision.so /usr/local/lib/libBulletDynamics.so /usr/local/lib/libBulletMultiThreaded.so 导致无法包含来自项目符号的示例头文件

以上是关于包括使用 automake 和 autoconf 的动态库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 autoconf/automake 中使用协议缓冲区?

安装 Autoconf, Automake & Libtool

C++学习(三四四)./configuremakemake install,autoconf automake

autoconf/automake:基于库存在的条件编译?

如何通过 autoconf/automake 排除 boost 库/头文件包含问题?

使用 automake/autoconf 条件生成文件