使用automake和autoconf安装C ++程序

时间:2015-07-20 09:48:06

标签: c++ c++11 makefile automake

我用C ++编写了一个程序,但现在我必须用autoconf和automake安装这个程序。

因此,当我运行命令“./configure&& make&& make install”时,它必须执行以下操作:

  • 编译程序
  • 在/ opt中创建文件夹my_program(例如:/ opt / my_program /),在此文件夹中我还必须拥有所有静态库和源文件
  • my_program
  • / usr / local / bin中必须有符号链接
  • 图书馆必须位于/ usr / local / lib(完成 - 感谢@Galik)
  • my_program的头文件必须位于/ usr / local / include(DONE)

我写过这个configure.ac脚本:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([my_program], [0.1], [my_mail])
AC_CONFIG_SRCDIR([AbsAlgorithm.hpp])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h sys/time.h unistd.h wchar.h wctype.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_CHECK_FUNCS([gettimeofday memset mkdir])

LIBS="-ldl"

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

和这个Makefile.am脚本:

AUTOMAKE_OPTIONS = foreign

AM_CXXFLAGS=-Wall -std=gnu++11 -DVERSION=\"$(VERSION)\" -DPROG="\"$(PACKAGE)\""

bin_PROGRAMS = algatorc
noinst_LIBRARIES = libalgatorc.a
libalgatorc_a_SOURCES = Timer.cpp
include_HEADERS = Timer.hpp TestSetIterator.hpp TestCase.hpp ETestSet.hpp EParameter.hpp Entity.hpp ParameterSet.hpp AbsAlgorithm.hpp Log.hpp JSON.hpp
algatorc_SOURCES = ParameterSet.cpp TestCase.cpp EParameter.cpp ETestSet.cpp TestSetIterator.cpp Entity.cpp Timer.cpp  main.cpp JSON.cpp JSONValue.cpp

现在,当我运行“./configure&& make&& make install”时,我没有在/ opt中获得名为my_program的新文件夹。但是,我现在,我在/ usr / local / include中有头文件。我在/ usr / local / lib中没有lib文件。 python只有一个文件夹。我想有一个名为my_program的文件夹,在该文件夹中我希望有静态库。

我正在使用Ubuntu 12.04 x64

我将不胜感激任何帮助。谢谢

1 个答案:

答案 0 :(得分:0)

Autotools并非真正用于将物品放置在特定位置。想法是程序进入程序目录 $(bindir) libraries目录 $(libdir)中的库等,并且安装所有内容的人都可以自行决定那些地方在哪里。

所以你真的应该只关心安装相对于运行安装程序的人想要的东西。

他们通过向configure脚本添加参数来执行此操作,如:

configure --prefix=/opt/myprog

通常会安装/opt/myprog/bin中的程序和/opt/myprog/lib等中的库...

您可以通过设置特殊dir变量来添加安装内容的位置。例如,要将库放在$(libdir)(默认/ usr / local / lib)的子目录中,您可以执行以下操作:

myprog_librarydir = $(libdir)/myprog

对于头文件执行相同的操作并不罕见:

myprog_includedir = $(prefix)/include/myprog

它定义了一些您可以引用的目标文件夹,而不是默认值:

myprog_include_HEADERS = \
    Timer.hpp \
    TestSetIterator.hpp \
    TestCase.hpp \
    ETestSet.hpp \
    EParameter.hpp \
    Entity.hpp \
    ParameterSet.hpp \
    AbsAlgorithm.hpp \
    Log.hpp \
    JSON.hpp

现在将这些安装到$(prefix)/include/myprog

与相应的库类似:

myprog_library_LIBRARIES = libmyprog.a

libmyprog_a_SOURCES = \
    ParameterSet.cpp \
    TestCase.cpp \
    EParameter.cpp \
    ETestSet.cpp \
    TestSetIterator.cpp \
    Entity.cpp \
    Timer.cpp \
     JSON.cpp \
    JSONValue.cpp

所以基本上你使用:

创建目的地(安装)目录
mynamedir = $(prefix)/path/... whatever

这允许您设置bin_lib_include_等以外的目的地...

所以,不要说lib_LIBRARIES,而是说myname_LIBRARIES

希望有所帮助。