2012-05-09 5 views
5

두 개의 C++ 클래스가 있고 autotools 및 libtool을 사용하여 공유 라이브러리로 컴파일하려고합니다. configure를 호출하지만,Libtool은 정적 라이브러리 만 생성합니다. 공유 객체가 필요합니다.

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의이 정적 libs와 생성 - :

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이 내 configure.ac 및 Makefile.am 파일입니다 disable-static - 공유 객체를 생성하도록 스크립트에 명시 적으로 지시하도록 사용 가능합니다. 내 파일에 어떤 문제가 있습니까?

--- 편집 --- 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

링커가 실행될 때 실제 링크 선은 어떻게 생깁니 까? – HonkyTonk

+0

첫 번째 게시물 수정 – Zbigh1

+0

configure.ac에서 AC_PROG_LIBTOOL은 중복됩니다. LT_INIT가이를 바꿉니다. –

답변

4

libtool이 어떻게 든 그것을 공유 라이브러리를 지원하지 않는 플랫폼에서의 믿는다면, 그것은 단순히 당신을 무시하고 구축 대신 정적 라이브러리. 나는 당신이 크로스 컴파일을하고있는 것을보고, 아마도 libtool은 타겟 플랫폼을위한 공유 라이브러리를 만드는 방법을 모른다.

당신은

같은 것이 ...

다음은 config.log을 읽을 수없는 이유를 알아 내기 위해 공유 라이브러리를 구축하지 여부를 점검라는 한 줄을 위해 configure 출력을 확인 할 수 있습니다

.

+0

configure --host = arm을 사용했습니다. --host = arm-linux 여야합니다. 감사. – Zbigh1