Удалить зависимость разделяемой библиотеки - PullRequest
3 голосов
/ 25 мая 2020

Я работаю над пакетом программного обеспечения с открытым исходным кодом, который я хотел бы распространять как двоичный файл. Для этого требуется общая библиотека, созданная с использованием:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...