2012-05-06 13 views
5

私はsnortと呼ばれるオープンソースプロジェクトを、LinuxではC言語で書いています。私はnetbeansでプロジェクトを正しく開いたので、このソースコードにいくつかの変更を加えるつもりです。プログラムのsrcフォルダにはいくつかのフォルダがあり、各フォルダにはいくつかのフォルダがあります。 netbeansがmakeファイルを生成できると聞きました。私はフォルダXFolderのsrcファイルにいくつかの変更を加えており、プロジェクト(YFolder)の別のフォルダでライブラリ関数を使いたいと思っています。私は.hファイルをインクルードし、関数を正しく使いました。はCでヘッダファイルをコンパイルしてコンパイルします

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

今、私はプログラムをコンパイルすることができたとき、それはOKですが、私はmakeプロセスで作成されたダイナミックライブラリ「の.so(共用オブジェクトファイル)」を使用する場合、プログラムを実行すると、定義されていない別のフォルダから使用した関数を意味するエラーが表示され、このエラーが表示されます。 (sfxhash_newは私が呼び出した外部関数の名前です)。

libsf_sip_preproc.so:未定義シンボル:sfxhash_new

Iはまた、Makefile.amを編集して、そのパッケージ(../YFolder/lib.c and lib.h)のソースを追加し、しかし効果的ではない。誰も私を助けることができますか?

EDIT:

私は、ファイル内の関数を使用したいフォルダのsrc /ダイナミックプリプロセッサ/ 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 @[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

LDFLAGSの最後に '-lnet -lpcre'などのフラグを置く必要がありますか? –

+1

これはまた助けるかもしれません[こちら](http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s) – ervinbosenbacher

+3

'定義されていないシンボル'のエラーは、正しいまたは間違ったヘッダファイルインクルードとは関係ありません。それらはリンカのエラーであり、いくつかのライブラリが見つからないことを示しています。 –

答えて

1

あなたが書かれているとおり:

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 

SO_WITH_STATIC_LIBがtrueの場合、私はこの行を考える:

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 

する必要があります
libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a 

それは私の考えです。試してみてください。

+1

これは間違っています。 '.la'ファイルはlibtoolのアーカイブファイルで、必要に応じて静的ライブラリと動的ライブラリの両方を生成するために' libtool'によって使用されます –

2

Makefile.amファイルに変更を行った後、変更はすぐに反映されません(すなわち、あなたがconfigure & makeを実行する場合は、変更内容は表示されません)。最初に対応するMakefile.inファイルを生成/更新する必要があります。そのためには、automakeコマンドをソースツリーの最上位ディレクトリ(configure.inまたはconfigure.acがある)で実行する必要があります。新しいソースを含むようにMakefile.amの変更を反映させるには、libsf_sip_preproc_la_SOURCESMakefile.amと同じファイルセットであり、Makefile.inであることを確認してください。今、configuremakeコマンドを実行します。
ソースツリー内のある場所から別の場所にファイルを追加すると、独自の依存関係が生成されることがあります。sfxhashソースファイルには、というファイルが含まれています。その場合、Makefile.amの一部として存在しません。 INCLUDESを更新して、ソースで必要なディレクトリを追加したり、新しいライブラリを追加する必要があります(libsf_sip_preproc_la_LIBADD)。.la & .aファイルをlibsf_sip_preproc_la_LIBADDに混ぜて使用しないでください。
これが役立つことを願っています!

関連する問題