2012-05-09 9 views
5

Ho un paio di classi C++ e voglio compilarle in una libreria condivisa usando autotools e libtool. Queste sono le mie configure.ac e Makefile.am file:Libtool crea solo una libreria statica - Ho bisogno di oggetti condivisi

configure.ac:

AC_PREREQ(2.67) 
AC_INIT(somelib.so, 1.0, [email protected]) 
AC_LANG(C++) 
AM_INIT_AUTOMAKE(somelib, 1.0) 

LT_INIT([disable-static]) 
AM_DISABLE_STATIC 
AM_PROG_LIBTOOL 
AC_LIBTOOL_DLOPEN 
AC_PROG_LIBTOOL 

AC_CONFIG_SRCDIR([Logger.cpp]) 
AC_CONFIG_HEADER([config.h]) 

# Checks for programs. 
AC_PROG_CXX 
AC_PROG_CC 

AC_SUBST(LIBTOOL_DEPS) 
AC_LTDL_DLLIB 
AC_PROG_RANLIB 

AC_SUBST(LIBTOOL_DEPS) 
AC_LTDL_DLLIB 

# Checks for libraries. 

# Checks for header files. 
AC_HEADER_STDC 
AC_CHECK_HEADERS([cstring unistd.h pthread.h]) 

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

# Checks for library functions. 
AC_FUNC_MALLOC 
AC_FUNC_REALLOC 
AC_TYPE_SIGNAL 
AC_CHECK_FUNCS([mkdir strdup dup2]) 
AC_CHECK_LIB(pthread, pthread_create, [], [ echo "ERROR!: libpthread not found!"; exit -1], []) 
AC_CHECK_LIB(xml2, htmlReadMemory, [], [ echo "ERROR!: libxml2 not found!"; exit -1], []) 

AC_CONFIG_MACRO_DIR([m4]) 
AC_OUTPUT(Makefile) 

Makefile.am:

AUTOMAKE_OPTIONS = foreign 

ACLOCAL_AMFLAGS = -I m4 
CPPFLAGS = `xml2-config --cflags` -g -fPIC -Wall -O2 
AM_LDFLAGS = `xml2-config --libs` -pthread -shared -L$(libdir) -L.libs -lboost_iostreams -lz -lbz2 -L/shared/hudson/arm/lib -I/shared/hudson/arm/include 

LIBVER=1:0:0 

lib_LTLIBRARIES = somelib.la 
somelib_la_SOURCES = <sources go here> 

somelib_la_LDFLAGS = -version-info $(LIBVER) 

library_includedir=$(includedir)/os 
library_include_HEADERS = <headers go here> 

Libtool crea solo librerie statiche, anche se io chiamo configure - disable-static --enable-shared per istruire esplicitamente lo script per creare oggetti condivisi. Cosa c'è di sbagliato con i miei file?

--- EDIT ---

I collegamenti cmd da libtool:

/bin/bash ./libtool --tag=CXX --mode=link arm-cortex_a8-linux-gnueabi-g++ -g -O2 -version-info 1:0:0 -o somelib.la -rpath /usr/local/lib AutoMutex.lo IniParser.lo Logger.lo Mutex.lo ProcInfo.lo Timer.lo XmlDocContainer.lo XmlNode.lo XmlParser.lo XmlSchemaValidator.lo XmlTree.lo ByteArray.lo IXmlEngine.lo LoggerSetup.lo Process.lo Thread.lo Utils.lo XmlError.lo XmlObjectEngine.lo XmlSchemaEngine.lo XmlSimpleEngine.lo Unziper.lo MUTool.lo -lxml2 -lpthread -ldl -ldl 
libtool: link: arm-cortex_a8-linux-gnueabi-ar cru .libs/somelib.a AutoMutex.o IniParser.o Logger.o Mutex.o ProcInfo.o Timer.o XmlDocContainer.o XmlNode.o XmlParser.o XmlSchemaValidator.o XmlTree.o ByteArray.o IXmlEngine.o LoggerSetup.o Process.o Thread.o Utils.o XmlError.o XmlObjectEngine.o XmlSchemaEngine.o XmlSimpleEngine.o Unziper.o MUTool.o 
libtool: link: arm-cortex_a8-linux-gnueabi-ranlib .libs/somelib.a 
libtool: link: (cd ".libs" && rm -f "somelib.la" && ln -s "../somelib.la" "somelib.la") 
make[1]: Leaving directory `/home/bg/workspace/git/somelib/src' 
+0

Che aspetto ha la linea di collegamento effettiva quando viene eseguito il linker? – HonkyTonk

+0

Modificato il primo post – Zbigh1

+0

In configure.ac, AC_PROG_LIBTOOL è ridondante. LT_INIT lo sostituisce. –

risposta

4

Se libtool crede in qualche modo è su una piattaforma che non supporta le librerie condivise, semplicemente ti ignora e costruisce librerie statiche invece. Vedo che stai cross-compilando, forse libtool non sa come costruire librerie condivise per la piattaforma di destinazione.

Ti consigliamo di controllare il vostro configure uscita per una linea che dice qualcosa come

controllare se costruire librerie condivise ... no

e poi leggere config.log per scoprire perché .

+0

Ho usato configure --host = arm, dovrebbe essere --host = arm-linux. Grazie. – Zbigh1