включая файлы заголовков в C и компилировать

Я работаю с проектом с открытым исходным кодом под названием snort, который написан на C под Linux. Я правильно открыл проект в netbeans и сейчас собираюсь внести некоторые изменения в этот исходный код. Папка src программы содержит несколько папок, а также в каждой папке есть несколько папок. Я слышал, что netbeans может создавать файлы make. Я вношу некоторые изменения в файлы src в папке XFolder и хочу использовать библиотечную функцию в другой папке в моем проекте (YFolder). Я включил файл .h и правильно использовал функцию.

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

Теперь, когда я могу скомпилировать программу, все в порядке, но когда я использую динамические библиотеки ".so (общие объектные файлы)", созданные в процессе make; и запустите программу, я вижу ошибку, которая означает, что функция, которую я использовал из другой папки, не определена, и вижу эту ошибку; (sfxhash_new - это имя внешней функции, которую я вызвал).

libsf_sip_preproc.so: неопределенный символ: sfxhash_new

Я также отредактировал Makefile.am и добавил исходники этого пакета (../YFolder/lib.c and lib.h); Но не эффективно. Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ:

Я нахожусь в папке src / dynamic-preprocessor / sip. Я хочу использовать функцию в файле: src / sfutil / sfxHash.c, имя функции - sfxhash_new (... ... ...) Я правильно включил sfxHash.h. Я внес некоторые изменения в свой файл Makefile.am, но это основной файл makefile.

Мой файл 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 @XCCFLAGS@
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

person sajad    schedule 06.05.2012    source источник
comment
Вы должны поместить флаги '-lnet -lpcre' и т. Д. В самый конец LDFLAGS, вы это сделали?   -  person    schedule 06.05.2012
comment
Также обратите внимание, что ошибки «неопределенный символ» не имеют ничего общего с правильным или неправильным включением файла заголовка; это ошибки компоновщика и показывают, что отсутствуют некоторые библиотеки.   -  person    schedule 06.05.2012
comment
@ H2CO3 есть флаги (-shared -export-dynamic -module @ XCCFLAGS @ if SO_WITH_STATIC_LIB) после LDFLAGS. Я добавил это в Makefile.am и снова настроил свой проект; тогда я делаю этот пакет .. Но сталь я вижу эту ошибку!   -  person sajad    schedule 06.05.2012
comment
Затем покажите нам ваш точный макет каталога и весь make-файл.   -  person    schedule 06.05.2012
comment
Как правильно связать функцию внешней библиотеки в этой части проекта? make файл содержит (AUTOMAKE_OPTIONS = внешние не-зависимости) в первой строке   -  person sajad    schedule 06.05.2012
comment
@ H2CO3: Я добавил свой make-файл. Если это необходимо, сообщите мне.   -  person sajad    schedule 06.05.2012
comment
@xebo: Спасибо, мистер Но файл .so расположен правильно, и я указал его для своей программы. Я также успешно внес некоторые изменения в свои файлы src; но когда я хочу использовать другую часть моей программы, у меня возникает эта проблема.   -  person sajad    schedule 06.05.2012
comment
Здесь более ранняя публикация, которая поможет вам как изучить файл .so, какие символы он экспортирует.   -  person ervinbosenbacher    schedule 06.05.2012
comment
@xebo: Спасибо; Ваша предыдущая ссылка была полезна для меня о линкере и библиотеках.   -  person sajad    schedule 06.05.2012
comment
@sajad: Нет проблем. :) Успевать. :)   -  person ervinbosenbacher    schedule 06.05.2012


Ответы (2)


После внесения изменений в Makefile.am файл изменения не отражаются сразу (т.е. если вы запустите configure & make, вы не увидите изменений). Вы должны сначала сгенерировать / обновить соответствующий Makefile.in файл. Для этого вам нужно запустить команду automake в самом верхнем каталоге исходного дерева (где находится configure.in или configure.ac). Чтобы убедиться, что ваши Makefile.am изменения для включения новых источников будут успешно отражены в сборке, убедитесь, что libsf_sip_preproc_la_SOURCES - это тот же набор файлов, что и в Makefile.am, и в Makefile.in. Теперь запустите команды configure и make.
Обратите внимание, что добавление файла из одного места в другое в исходном дереве может привести к его собственному набору зависимостей, т.е. sfxhash исходные файлы могут включать файлы и связываться с библиотеками, которые не присутствуют как часть of Makefile.am, о котором идет речь, и в этом случае вам, возможно, придется обновить INCLUDES, чтобы включить каталог, необходимый для источника, и / или добавить новые библиотеки в libsf_sip_preproc_la_LIBADD. Избегайте смешивания файлов .la и .a в libsf_sip_preproc_la_LIBADD.
Надеюсь, это поможет!

person another.anon.coward    schedule 07.05.2012

Как вы написали:

libsf_sip_preproc_la_LDFLAGS = -shared -export-dynamic -module @XCCFLAGS@
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

если SO_WITH_STATIC_LIB истинно, я думаю, что эта строка:

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la

должно быть

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a

это моя идея, вы можете попробовать.

person MYMNeo    schedule 07.05.2012
comment
Это не так. .la - это архивные файлы libtool, они используются libtool для создания как статических, так и динамических библиотек по мере необходимости. - person another.anon.coward; 07.05.2012