2011-02-13 13 views
5

Primero tengo "include_HEADERS = 'mis cabeceras públicas'" y "libfoobar_la_SOURCES = 'fuentes privadas' 'cabeceras privadas' '. Todo está bien. Compila/instala/enlaza. Pero cuando lo hago "nm -C my_instaed_lib.so" me sale:automake + libtool + C++ = interfaz muy hinchada

00005be0 T yyget_debug(void*) 
00005b00 T yyget_extra(void*) 
00005bf0 T yyset_debug(int, void*) 
00005bb0 T yyset_extra(FM4::LexImpl*, void*) 
00005b40 T yyget_column(void*) 
00005b10 T yyget_lineno(void*) 
00006180 T yyset_column(int, void*) 
000061e0 T yyset_lineno(int, void*) 
... 

Esto nunca declarada en cualquier cabecera.

000091f0 T FM4::PrcImpl::CollectMacro() 
000089d0 T FM4::PrcImpl::CollectQuote() 
00008870 T FM4::PrcImpl::CollectComment() 
00009350 T FM4::PrcImpl::Collect() 
000093f0 T FM4::PrcImpl::Process() 
00008700 T FM4::PrcImpl::PrcImpl(FM4::Processor*) 
00008590 T FM4::PrcImpl::PrcImpl(FM4::Processor*) 
00009970 W FM4::PrcImpl::~PrcImpl() 
00009a00 W FM4::PrcImpl::~PrcImpl() 
... 

Esto en el encabezado privado no instalado.

He leído el manual de automake/libtool dos veces, pero no sé cómo despojar a esta basura de la interfaz? O qué puede exponer esta basura a la API pública. ¿Cómo controlar qué exportar a API pública?

+0

¿Hace algo con flex/lex? – Anycorn

+0

Sí. Reentrant flex lexer pero no declarado en ningún encabezado. – SQLek

Respuesta

8

Busque la opción libtool -export-symbols. Dale una lista de símbolos que deseas exportar. Por defecto, libtool exporta todos los símbolos.

3

Si eres aventurero, y puede estar seguro de que se está compilando con un nuevo suficiente GCC (creo ≥4.2 es necesario para un buen soporte), visibility puede ayudar.

Restringir la visibilidad predeterminada (-fvisibility=hidden) y marcar explícitamente las funciones que desea exportar con __attribute__((visibility("default"))).