2012-05-06 14 views
5

Pracuję z projektem open source o nazwie snort, który jest napisany w C, pod Linuksem. Poprawnie otworzyłem projekt w netbeans i teraz zamierzam wprowadzić pewne zmiany w tym kodzie źródłowym. Folder src programu zawiera kilka folderów, a także każdy folder ma kilka folderów. Słyszałem, że netbeans jest w stanie generować pliki make. Wprowadzam zmiany w plikach src w folderze XFolder i chcę użyć funkcji bibliotecznej w innym folderze w moim projekcie (YFolder). Zawarłem plik .h i użyłem funkcji poprawnie.w tym pliki nagłówkowe w C i kompilacja

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

Teraz, kiedy mogę skompilować program, to jest ok, ale kiedy używać dynamicznych bibliotek „.so (współdzielone pliki obiektowe)”, który powstał w procesie make; i uruchom program, widzę błąd, który oznacza, że ​​funkcja używana z innego folderu nie jest zdefiniowana i widzę ten błąd; (sfxhash_new to nazwa funkcji zewnętrznej, którą wywołałem).

libsf_sip_preproc.so: nieokreślony symbol: sfxhash_new

również edytowany Makefile.am i dodaje źródło tego pakietu (../YFolder/lib.c and lib.h); Ale nieskuteczne. Czy ktoś może mi pomóc?

EDIT:

jestem w katalogu src/dynamic-preprocesor/SIP chcę użyć funkcji w pliku: src/sfutil/sfxHash.c nazwa funkcji jest sfxhash_new (... .. ...) Zawarłem poprawnie plik sfxHash.h. Zrobiłem kilka zmian w moim Makefile.am, ale głównym makefile jest to. Plik

My 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

Musisz umieścić flagi "-lnet -lpcre" itd. Na samym końcu LDFLAGS, zrobiłeś to? –

+1

To też może pomóc [tutaj] (http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s) – ervinbosenbacher

+3

Uwaga błędy "niezdefiniowanego symbolu" nie mają nic wspólnego z poprawnym lub niepoprawnym włączeniem pliku nagłówkowego; są to błędy linkera i pokazują, że brakuje niektórych bibliotek. –

Odpowiedz

1

Jak masz napisane:

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 

jeśli SO_WITH_STATIC_LIB to prawda, myślę, że ten wiersz:

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 

powinny być

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a 

To jest mój pomysł, możesz spróbować.

+1

To nie jest poprawne. Plik '.la' to pliki archiwum libtool używane przez' libtool' do generowania bibliotek statycznych i dynamicznych zgodnie z potrzebą –

2

Po wprowadzeniu zmian w Makefile.am pliku, zmiany nie są od razu widoczne (czyli po uruchomieniu configure & make nie będzie widać zmian). Najpierw należy wygenerować/zaktualizować odpowiedni plik Makefile.in. W tym celu należy uruchomić polecenie automake w najwyższym katalogu drzewa źródłowego (gdzie znajduje się configure.in lub configure.ac). Aby upewnić się, że zmiana Makefile.am na nowe źródła zostanie uwzględniona w kompilacji, sprawdź, czy libsf_sip_preproc_la_SOURCES to ten sam zestaw plików w numerze Makefile.am, a także Makefile.in. Teraz uruchom polecenia configure i make.
Należy pamiętać, że dodanie pliku z jednego miejsca do drugiego w drzewie źródłowym może przynieść jego własny zestaw zależności, tj. sfxhash pliki źródłowe mogą zawierać pliki & w linkach do bibliotek, które nie są obecne w ramach danej Makefile.am, w takim przypadku może wymagać aktualizacji INCLUDES, aby uwzględnić katalog wymagany przez źródło i/lub dodać nowe biblioteki w libsf_sip_preproc_la_LIBADD.Unikaj mieszania plików .la w libsf_sip_preproc_la_LIBADD.
Mam nadzieję, że to pomoże!

Powiązane problemy