Я работаю над пакетом программного обеспечения с открытым исходным кодом, который я хотел бы распространять как двоичный файл. Для этого требуется общая библиотека, созданная с использованием:
aclocal
automake --add-missing
autoconf
./configure
make install
, что дает следующие библиотеки:
libMUSCLE-3.7.a
libMUSCLE-3.7.la
libMUSCLE-3.7.so
libMUSCLE-3.7.so.1
libMUSCLE-3.7.so.1.0.0
pkgconfig
, а затем пакет создается с использованием
aclocal
automake --add-missing
autoconf
make LDADD=-lMUSCLE-3.7
make install
Однако , после сборки окончательного исполняемого файла foo
, если я перенесу foo
в другую систему, я получу жалобу, что libMUSCLE-3.7.so.1
не может быть найден. Я пробовал переместить foo
вместе с библиотеками libMUSCLE
, чтобы сохранить относительную структуру, но похоже, что где-то в исполняемом файле foo
есть жестко запрограммированный полный путь к общей библиотеке. Как я могу скомпилировать foo
, чтобы он был автономным. В качестве альтернативы, могу ли я скомпилировать foo
, чтобы он использовал относительный путь для поиска разделяемой библиотеки?
Ниже приведены файлы configure.ac
для autoconf:
libMUSCLE configure.ac
:
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.59])
AC_INIT(libMUSCLE/muscle.h)
AC_CONFIG_AUX_DIR(config)
AC_CONFIG_MACRO_DIR([m4])
dnl -----------------------------------------------
dnl Package name and version number (user defined)
dnl -----------------------------------------------
GENERIC_LIBRARY_NAME=libMUSCLE
#release versioning
GENERIC_MAJOR_VERSION=1
GENERIC_MINOR_VERSION=0
GENERIC_MICRO_VERSION=0
#API version (often = GENERIC_MAJOR_VERSION.GENERIC_MINOR_VERSION)
GENERIC_API_VERSION=3.7
AC_SUBST(GENERIC_API_VERSION)
#shared library versioning
GENERIC_LIBRARY_VERSION=1:0:0
# | | |
# +------+ | +---+
# | | |
# current:revision:age
# | | |
# | | +- increment if interfaces have been added
# | | set to zero if interfaces have been removed
# or changed
# | +- increment if source code has changed
# | set to zero if current is incremented
# +- increment if interfaces have been added, removed or changed
dnl --------------------------------
dnl Package name and version number
dnl --------------------------------
AC_SUBST(GENERIC_LIBRARY_VERSION)
PACKAGE=$GENERIC_LIBRARY_NAME
AC_SUBST(GENERIC_LIBRARY_NAME)
GENERIC_VERSION=$GENERIC_MAJOR_VERSION.$GENERIC_MINOR_VERSION.$GENERIC_MICRO_VERSION
GENERIC_RELEASE=$GENERIC_MAJOR_VERSION.$GENERIC_MINOR_VERSION
AC_SUBST(GENERIC_RELEASE)
AC_SUBST(GENERIC_VERSION)
VERSION=$GENERIC_VERSION
AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
dnl Override default O2
CFLAGS=${CFLAGS-""}
CXXFLAGS=${CXXFLAGS-""}
AC_PREFIX_DEFAULT(/usr/local)
dnl Checks for programs.
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LN_S
AM_PROG_LIBTOOL
dnl Check what compiler we're using
AM_CONDITIONAL(ICC, test x$CC = xicc )
dnl Checks for header files.
AC_HEADER_STDC
dnl Allow debugging compilation
AC_ARG_ENABLE(debug,
[ --enable-debug Turn on debugging],
[case "${enableval}" in
yes) debug=true ;;
no) debug=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
esac],[debug=false])
AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
dnl Mac OS X won't allow static compilation...
STATIC_FLAG=""
if ( test "x$target_vendor" = "xapple") then
STATIC_FLAG=""
fi
AC_SUBST(STATIC_FLAG)
dnl Check for OpenMP
#AX_OPENMP()
AC_SUBST(OPENMP_CFLAGS)
dnl OpenMP checker only defines for C when compiling both C and C++
OPENMP_CXXFLAGS=$OPENMP_CFLAGS
AC_SUBST(OPENMP_CXXFLAGS)
dnl Make doxygen docs
#DX_INIT_DOXYGEN( "libMUSCLE", "projects/libmuscle.doxygen", "doc" )
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
dnl AC_C_BIGENDIAN
AC_HEADER_TIME
dnl Checks for library functions.
AC_PROG_GCC_TRADITIONAL
dnl SAVE_LIBRARY_VERSION
AC_SUBST(LIBTOOL_VERSION_INFO)
AC_OUTPUT(Makefile libMUSCLE/Makefile libMUSCLE-3.7.pc )
foo
configure.ac
AC_INIT(parsnp,1.0)
AM_INIT_AUTOMAKE(parsnp,1.0)
AC_PROG_CC(gcc)
AC_ARG_WITH(libmuscle, [ --with-libmuscle=<path/to/libmuscle> libMUSCLE install dir (default: `pwd`/muscle)])
if test "$with_libmuscle" == ""
then
with_libmuscle=`pwd`/muscle
fi
AC_LANG(C++)
CPPFLAGS="-I$with_libmuscle"
AC_CHECK_HEADER(libMUSCLE/muscle.h, [result=1], [result=0])
if test $result == 0
then
AC_MSG_ERROR([libMUSCLE headers not found.])
fi
AC_SUBST(libmuscle, $with_libmuscle)
AC_OUTPUT(Makefile src/Makefile)