【问题标题】:Libtool not installing sub-projectsLibtool 没有安装子项目
【发布时间】:2012-06-21 14:15:28
【问题描述】:

我正在使用 C++ 开发一个项目,希望实现添加插件的功能。编译过程由 Autotools 处理。我设法正确设置了文件结构,并且编译了主项目和插件,但由于某种原因,在运行make install 时省略了插件。单独编译和安装插件时,它工作正常。我在这里遗漏了什么,或者为什么没有从顶部文件夹安装插件?

configure.ac

AC_PREREQ(2.58)
AC_INIT([Net Responsibility],[3.1r323],[contact@netresponsibility.com])
AC_SUBST([LIBTOOL_DEPS])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_SRCDIR([src/main.cpp])
AC_CONFIG_SUBDIRS([plugins/defaultReport])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([scripts/m4])
AC_CANONICAL_SYSTEM
AC_LANG([C++])
AC_PREFIX_PROGRAM([make])

AM_INIT_AUTOMAKE([subdir-objects])

LT_PREREQ([2.2])
LT_INIT([shared])


# Checks for programs.
AC_PROG_CXX
AC_PROG_INSTALL

# Checks for header files.
AC_HEADER_STDC


...

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am

# Main library
lib_LTLIBRARIES = libNetResponsibility.la
libNetResponsibility_la_SOURCES = \
      @top_srcdir@/src/MainApplication.cpp\
      ...
libNetResponsibility_la_CPPFLAGS = $(cppFlags)
libNetResponsibility_la_LDFLAGS = -no-undefined $(ldFlags)

# Minimal executable
bin_PROGRAMS = net-responsibility
net_responsibility_SOURCES = @top_srcdir@/src/main.cpp
net_responsibility_LDADD = -lNetResponsibility

dist_pkgdata_DATA = \
      $(top_srcdir)/data/txt.xml\
      $(top_srcdir)/COPYING

dist_pkgdata_SCRIPTS = $(top_srcdir)/scripts/init.d
dist_noinst_SCRIPTS = $(top_srcdir)/scripts/postinst\
      $(top_srcdir)/scripts/prerm

AM_LDFLAGS = -L/usr/local/lib -L/usr/lib
ACLOCAL_AMFLAGS = -I scripts/m4

incDirs = -I$(top_srcdir)/include

ldFlags = -L/usr/local/lib -L/usr/lib

cppFlags = $(incDirs)\
           -DPKGDATADIR='$(pkgdatadir)'\
           -DPKGLIBDIR='$(pkglibdir)'\
           -DDATABASEDIR='$(databasedir)'\
           -DPIDDIR='$(piddir)'\
           @CPPFLAGS@

AM_CXXFLAGS = $(incDirs) @CXXFLAGS@
AM_CPPFLAGS = $(cppFlags)

EXTRA_DIST = $(top_srcdir)/lib $(top_srcdir)/include

SUBDIRS = . plugins/defaultReport

install: install-am postinst

uninstall: prerm uninstall-am postrm

postinst:
    $(top_srcdir)/scripts/postinst $(pkgdatadir) $(initdir)

prerm:
    $(top_srcdir)/scripts/prerm $(pkgdatadir) $(initdir)

postrm:
    rm -f $(piddir)/net-responsibility.pid
    rm -f $(pkgdatadir)/blacklist.xml
    rm -f $(pkgdatadir)/config.xml
    rm -rf $(pkgdatadir)/reports
    rm -f $(databasedir)/net-responsibility.db
    rm -f $(initdir)/net-responsibility

.PHONY: prerm postinst postrm

plugins/defaultReport/configure.ac

AC_PREREQ(2.58)
AC_INIT([Net Responsibility Plugin: Default Report],[0.1],[contact@netresponsibility.com])
AC_SUBST([LIBTOOL_DEPS])
AC_SUBST([nrlibdir], ["${libdir}/net-responsibility"])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_SRCDIR([src/Report.cpp])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_LANG([C++])
AC_PREFIX_PROGRAM([make])

AM_INIT_AUTOMAKE([subdir-objects])

LT_PREREQ([2.2])
LT_INIT([shared])

# Checks for programs.
AC_PROG_CXX
AC_PROG_INSTALL

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

plugins/defaultReport/Makefile.am

# General settings
ACLOCAL_AMFLAGS = -I m4

ldFlags = -L/usr/local/lib -L/usr/lib

AM_CXXFLAGS = @CXXFLAGS@

# Module specific settings
nrlib_LTLIBRARIES = defaultReport.la
defaultReport_la_SOURCES = \
   src/Report.cpp
defaultReport_la_LDFLAGS = -module -no-undefined $(ldFlags)
defaultReport_la_LIBADD = -lNetResponsibility
defaultReport_la_CPPFLAGS = -I../../include @CPPFLAGS@

【问题讨论】:

    标签: c++ makefile installation autotools libtool


    【解决方案1】:

    您需要稍微不同地设置nrlibdir

    plugins/defaultReport/configure.ac

    删除这一行:

    AC_SUBST([nrlibdir], ["${libdir}/net-responsibility"])
    

    plugins/defaultReport/Makefile.am

    nrlib_LTLIBRARIES之前添加这一行:

    nrlibdir=$(libdir)/net-responsibility
    

    这应该有助于automake 正确地获得make install

    编辑:这次我真的试过了。除上述更改外,删除 installuninstallMakefile.am 为目标。您应该将postinstprermpostrm 目标附加到其他一些安装挂钩,可能类似于:

    install-data-hook:
            $(top_srcdir)/scripts/postinst $(pkgdatadir) $(initdir)
    
    uninstall-local:
            $(top_srcdir)/scripts/prerm $(pkgdatadir) $(initdir)
    
    uninstall-hook:
            rm -f $(piddir)/net-responsibility.pid
            rm -f $(pkgdatadir)/blacklist.xml
            rm -f $(pkgdatadir)/config.xml
            rm -rf $(pkgdatadir)/reports
            rm -f $(databasedir)/net-responsibility.db
            rm -f $(initdir)/net-responsibility
    

    可以代替那些目标。

    【讨论】:

    • 感谢您的意见!我删除了 AC_SUBST 宏,并在 Makefile.am 中分配了 nrlibdir。 autoreconf 抱怨未设置变量(在范围内)。在 plugins/defaultReport/Makefile.am 中分配它时,它的工作方式与以前非常相似。插件按预期编译,但无法安装。
    • 非常感谢!现在它就像一个魅力。问题是被覆盖的installuninstall 目标。然而,在我看来,AC_SUBST 宏是不相关的,因为它可以以任何方式工作。
    • 我不确定 AC_SUBST 是否会一直这样工作,尤其是一直回到 autoconf 2.58 以及可能安装的任何相应的 automake。我以前没有尝试过以这种方式设置安装目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多