在C中包含头文件并编译

在C中包含头文件并编译,c,netbeans,include,shared-libraries,snort,C,Netbeans,Include,Shared Libraries,Snort,我正在从事一个名为的开源项目,它是在Linux下用C编写的。我在netbeans中正确地打开了这个项目,现在我要对这个源代码做一些更改。程序的src文件夹包含多个文件夹,并且每个文件夹都有一些文件夹。我听说netbeans能够生成make文件。我正在对XFolder文件夹中的src文件进行一些更改,并希望在我的项目(YFolder)的另一个文件夹中使用库函数。我包括了.h文件并正确使用了该函数 #include"../YFolder/lib.h" 现在,当我可以编译程序时,它是可以的,但当我使

我正在从事一个名为的开源项目,它是在Linux下用C编写的。我在netbeans中正确地打开了这个项目,现在我要对这个源代码做一些更改。程序的src文件夹包含多个文件夹,并且每个文件夹都有一些文件夹。我听说netbeans能够生成make文件。我正在对XFolder文件夹中的src文件进行一些更改,并希望在我的项目(YFolder)的另一个文件夹中使用库函数。我包括了.h文件并正确使用了该函数

#include"../YFolder/lib.h"
现在,当我可以编译程序时,它是可以的,但当我使用动态库“.so(共享对象文件)”,这是在make过程中创建的;并运行程序,我看到一个错误,这意味着我从其他文件夹使用的功能未定义,并看到这个错误;(sfxhash_new是我调用的外部函数的名称)

libsf_sip_preproc.so:未定义符号:sfxhash_new

我还编辑了Makefile.am并添加了该包的源代码(
。/YFolder/lib.c和lib.h
);但是没有效果。有人能帮我吗

编辑:

我在src/dynamic preprocessor/sip文件夹中 我想使用文件src/sfutil/sfxHash.c中的函数 函数名为sfxhash_new(……) 我正确地包含了sfxHash.h。 我在Makefile.am中做了一些更改,但主要的Makefile是这样的

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 @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
正如你所写的:

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

这是我的想法,您可以试试。

Makefile.am
文件中进行更改后,更改不会立即反映出来(即,如果您运行
configure
&
make
您将看不到更改)。您应该首先在文件中生成/更新相应的
Makefile.in。为此,您需要在源代码树的最顶层目录(其中
configure.in
configure.ac
驻留)中运行
automake
命令。要确保
Makefile.am
对包含新源的更改将成功地反映在生成中,请检查
libsf\u sip\u preproc\u la\u sources
Makefile.am
中的文件集是否相同。现在,运行
configure
make
命令。
请注意,将文件从源代码树中的一个位置添加到另一个位置可能会带来它自己的一组依赖项,即
sfxhash
源文件可能包括指向库的文件和链接,这些文件和链接不作为问题
Makefile.am
的一部分出现,在这种情况下,您可能需要更新
INCLUDES
以包含源代码所需的目录和/或在
libsf\u sip\u preproc\u la\u LIBADD
中添加新库。避免在
libsf\u sip\u preproc\u la\u LIBADD中混合
.la
.a
文件

希望这有帮助

您必须将“-lnet-lpcre”等标志放在LDFLAGS的末尾,是吗?这也可能有助于注意,“未定义符号”错误与正确或不正确的头文件包含无关;它们是链接器错误,表明某些库丢失。@H2CO3在LDFLAGS之后有(-shared-export-dynamic-module@XCCFLAGS@if-SO_和_STATIC_LIB)标志。我在Makefile.am中添加了这个,并再次配置了我的项目;然后我做了那个包裹。。但我看到了那个错误!然后向我们展示你的确切目录布局和整个makefile。这是不正确的
.la
文件是libtool归档文件,
libtool
使用这些文件根据需要生成静态和动态库