包括C语言中的头文件和编译

时间:2012-05-06 03:58:33

标签: c netbeans include shared-libraries snort

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

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

现在,当我可以编译程序时,它没关系,但是当我使用在make进程中创建的动态库“.so(共享对象文件)”时;并运行程序,我看到一个错误,这意味着我从其他未定义的文件夹中使用的函数,并看到此错误; (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

2 个答案:

答案 0 :(得分:2)

Makefile.am文件中进行更改后,更改不会立即反映出来(例如,如果您运行configure& make,您将看不到更改。您应该首先生成/更新相应的Makefile.in文件。为此,您需要在源树的最顶层目录中运行automake命令(configure.inconfigure.ac所在的目录)。为确保您的Makefile.am更改以包含新来源将成功反映在构建中,请检查libsf_sip_preproc_la_SOURCES中的Makefile.am是同一组文件以及Makefile.in。现在,运行configuremake命令 注意,在源树中将文件从一个地方添加到另一个地方可以引入其自己的一组依赖性,即sfxhash源文件可以包括文件&链接到未作为Makefile.am的一部分出现的库,在这种情况下,您可能必须更新INCLUDES以包含源所需的目录和/或在{{1}中添加新库}。避免混合libsf_sip_preproc_la_LIBADD& .la中的.a个文件 希望这有帮助!

答案 1 :(得分: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

这是我的想法,你可以尝试一下。