在C语言中包含头文件并进行编译

5

我正在使用一个名为snort的开源项目,该项目是在Linux下用C语言编写的。我已经正确地在netbeans中打开了这个项目,现在我要对这个源代码进行一些更改。程序的src文件夹包含了几个文件夹,每个文件夹又有一些文件夹。我听说netbeans能够生成make文件。我正在对XFolder文件夹中的src文件进行一些更改,并想在我的项目中的另一个文件夹(YFolder)中使用一个库函数。我已经包含了.h文件并正确地使用了这个函数。

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

现在我能编译程序,一切正常,但是当我使用在make过程中创建的动态库“.so(共享对象文件)”并运行程序时,我看到一个错误,意味着我从其他文件夹使用的函数未定义,并且看到以下错误(sfxhash_new是我调用的外部函数的名称)。

libsf_sip_preproc.so: undefined symbol: sfxhash_new

我还编辑了Makefile.am,并添加了该包的源代码(../YFolder/lib.c和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

1
这里也许会有帮助 这里 - ervinbosenbacher
3
请注意,“未定义符号”错误与正确或不正确的头文件包含无关;它们是链接器错误,并表示缺少某些库。 - user529758
@H2CO3 在 LDFLAGS 后面有 (-shared -export-dynamic -module @XCCFLAGS@ if SO_WITH_STATIC_LIB) 标志。我在 Makefile.am 中添加了这个标志并重新配置了我的项目;然后我制作了那个软件包。但是我仍然看到那个错误! - sajad
我该如何在项目的这一部分正确地链接外部库函数?make文件的第一行包含(AUTOMAKE_OPTIONS=foreign no-dependencies)。 - sajad
@H2CO3:我添加了我的Makefile。如果需要其他文件,请告诉我。 - sajad
显示剩余6条评论
2个回答

2
Makefile.am文件中进行更改后,更改不会立即反映出来(即,如果您运行configuremake,则不会看到更改)。您应该首先生成/更新相应的Makefile.in文件。为此,您需要在源树的最顶层目录(其中包含configure.inconfigure.ac)中运行automake命令。为确保您的Makefile.am更改以包括新的源文件将成功反映在构建中,请检查libsf_sip_preproc_la_SOURCESMakefile.amMakefile.in中是否是同一组文件。现在,运行configuremake命令。
请注意,在源树中从一个位置添加文件到另一个位置可能会带来自己的依赖项集,即sfxhash源文件可能包括文件并链接到不作为问题Makefile.am的一部分的库,这种情况下,您可能需要更新INCLUDES以包括源所需的目录和/或在libsf_sip_preproc_la_LIBADD中添加新库。避免在libsf_sip_preproc_la_LIBADD中混合.la.a文件。
希望这能帮到您!

1

正如您所写:

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

这是我的想法,你可以试试看。


1
这不正确。.la文件是libtool归档文件,它们由libtool用于根据需要生成静态和动态库。 - another.anon.coward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接