2012-05-06 16 views
5

Estoy trabajando con un proyecto de código abierto llamado snort, que está escrito en C, bajo Linux. Abrí el proyecto en netbeans correctamente y ahora voy a hacer algunos cambios en este código fuente. La carpeta src del programa contiene varias carpetas y también cada carpeta tiene algunas carpetas. Escuché que netbeans puede generar archivos make. Estoy haciendo algunos cambios en los archivos src en la carpeta XFolder y quiero usar una función de biblioteca en otra carpeta en mi proyecto (YFolder). Incluí el archivo .h y usé la función correctamente.incluyendo archivos de cabecera en C y compilar

#include"../YFolder/lib.h" 

Ahora cuando puedo compilar el programa, que está bien, pero cuando se utiliza bibliotecas dinámicas ".so (archivos de objetos compartidos)" que creó en el proceso de maquillaje; y ejecutar el programa, veo un error que significa que la función que utilicé de otra carpeta no está definida y veo este error; (sfxhash_new es el nombre de la función externa que llamé).

libsf_sip_preproc.so: undefined símbolo: sfxhash_new

I también corrigió Makefile.am y ha añadido las fuentes de ese paquete (../YFolder/lib.c and lib.h); Pero no es efectivo. ¿Alguien puede ayudarme por favor?

EDIT:

estoy en la carpeta src/dinámico-preprocesador/SIP Quiero usar una función en el archivo: src/sfutil/sfxHash.c el nombre de función es sfxhash_new (... .. . ...) Incluí sfxHash.h correctamente. Hice algunos cambios en mi archivo Makefile.am pero el archivo MAKE principal es este. archivo

Mi Makefile.am:

## $Id 
AUTOMAKE_OPTIONS=foreign no-dependencies 

INCLUDES = -I../include -I${srcdir}/../libs -I$(srcdir)/includes 

libdir = ${exec_prefix}/lib/snort_dynamicpreprocessor 

lib_LTLIBRARIES = libsf_sip_preproc.la 

libsf_sip_preproc_la_LDFLAGS = -shared -export-dynamic -module @[email protected] 
if SO_WITH_STATIC_LIB 
libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 
else 
nodist_libsf_sip_preproc_la_SOURCES = \ 
../include/sf_dynamic_preproc_lib.c \ 
../include/sf_ip.c \ 

endif 

libsf_sip_preproc_la_SOURCES = \ 
spp_sip.c \ 
spp_sip.h \ 
sip_config.c \ 
sip_config.h \ 
sip_parser.c \ 
sip_parser.h \ 
sip_dialog.c \ 
sip_dialog.h \ 
sip_roptions.c \ 
sip_roptions.h \ 
sip_utils.c \ 
sip_utils.h \ 
sip_debug.h \ 
../include/sfxhash.c \ -----------------> I have copied src files in this dictionary 
../include/sfxhash.h  ------------------> 

EXTRA_DIST = \ 
sf_sip.dsp 

all-local: $(LTLIBRARIES) 
    $(MAKE) DESTDIR=`pwd`/../build install-libLTLIBRARIES 
+0

Tienes que poner las banderas '-lnet -lpcre' etc. al final de LDFLAGS, ¿lo hiciste? –

+1

Esto también podría ser de ayuda [aquí] (http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s) – ervinbosenbacher

+3

También tenga en cuenta que los errores de 'símbolo no definido' no tienen nada que ver con la inclusión correcta o incorrecta del archivo de encabezado; son errores de enlazador y muestran que faltan algunas bibliotecas. –

Respuesta

1

A medida que han escrito:

libsf_sip_preproc_la_LDFLAGS = -shared -export-dynamic -module @[email protected] 
if SO_WITH_STATIC_LIB 
libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 
else 
nodist_libsf_sip_preproc_la_SOURCES = \ 
../include/sf_dynamic_preproc_lib.c \ 
../include/sf_ip.c \ 

endif 

si SO_WITH_STATIC_LIB es cierto, creo que esta línea:

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 

debería ser

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a 

esa es mi idea, puedes intentarlo.

+1

Eso no es correcto. El archivo '.la' son archivos de archivo libtool, estos son utilizados por' libtool' para generar bibliotecas estáticas y dinámicas según las necesidades –

2

Después de realizar cambios en Makefile.am archivo, los cambios no se reflejan de inmediato (es decir, si se ejecuta configure & make no verá los cambios). Primero debe generar/actualizar el archivo Makefile.in correspondiente. Para eso, necesita ejecutar el comando automake en el directorio superior del árbol fuente (donde configure.in o configure.ac reside). Para asegurarse de que sus cambios Makefile.am para incluir nuevas fuentes se reflejarán correctamente en la construcción, verifique que libsf_sip_preproc_la_SOURCES es el mismo conjunto de archivos en Makefile.am y Makefile.in. Ahora ejecute los comandos configure y make.
Tenga en cuenta que agregar un archivo de un lugar a otro en el árbol fuente puede traer su propio conjunto de dependencias; por ejemplo, sfxhash los archivos fuente pueden incluir archivos & en las bibliotecas que no están presentes como parte del cuestionario Makefile.am, en cuyo caso puede tener que actualizar INCLUDES para incluir el directorio necesario por el origen y/o agregar nuevas bibliotecas en libsf_sip_preproc_la_LIBADD.Evite mezclar .la & .a archivos en libsf_sip_preproc_la_LIBADD.
Espero que esto ayude!

Cuestiones relacionadas