2012-05-09 9 views
5

Ich habe ein paar C++ - Klassen und möchte sie mit autotools und libtool in eine gemeinsame Bibliothek kompilieren. Das sind meine configure.ac und Makefile.am-Dateien:Libtool erstellt nur statische Bibliothek - ich brauche gemeinsam genutzte Objekte

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 schafft nur statische Libs, obwohl ich configure nennen - disable-static --enable-shared, um das Skript explizit anzuweisen, gemeinsam genutzte Objekte zu erstellen. Was ist falsch an meinen Dateien?

--- EDIT ---

Der Link cmd von 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

Wie sieht die tatsächliche Verbindungslinie aus, wenn der Linker ausgeführt wird? – HonkyTonk

+0

Edited der erste Beitrag – Zbigh1

+0

In Ihrer configure.ac ist AC_PROG_LIBTOOL redundant. LT_INIT ersetzt es. –

Antwort

4

Wenn libtool irgendwie glaubt, dass es auf einer Plattform ist, die nicht gemeinsam genutzte Bibliotheken nicht unterstützt, ignoriert es einfach Sie und baut statische Bibliotheken statt. Ich sehe, dass Sie Cross-Compiling durchführen, vielleicht weiß Libtool nicht, wie man gemeinsam genutzte Bibliotheken für die Zielplattform erstellt.

Sie wollen werden Ihre configure Ausgang für eine Linie überprüfen, ob so etwas wie

sagt Überprüfung gemeinsam genutzte Bibliotheken bauen ... nein

und dann config.log lesen, um herauszufinden, warum .

+0

Ich benutzte configure --host = arm, sollte --host = arm-linux sein. Vielen Dank. – Zbigh1

Verwandte Themen