2012-05-06 64 views
5

我正在開發一個名爲snort的開源項目,它是用C語言編寫的,在Linux下。我正確地在netbeans中打開了項目,現在我將對此源代碼進行一些更改。程序的src文件夾包含多個文件夾,每個文件夾也有一些文件夾。我聽說netbeans能夠生成make文件。我正在對文件夾XFolder中的src文件進行一些更改,並希望在我的項目(YFolder)中的另一個文件夾中使用庫函數。我包含了.h文件並正確使用了該功能。在C中包含頭文件並編譯

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

現在,當我可以編譯該程序,這是好的,但是,當我使用動態庫「所以(共享對象文件)」,在化妝過程創建的;並運行程序,我看到一個錯誤,這意味着我從其他文件夾中使用的功能未定義,看到這個錯誤; (sfxhash_new是我調用的外部函數的名稱)。

libsf_sip_preproc.so:未定義符號:sfxhash_new

我還編輯Makefile.am並補充說封裝(../YFolder/lib.c and lib.h)的來源;但沒有效果。任何人都可以幫助我嗎?

編輯:

我在文件夾中的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

你必須把'-lnet -lpcre'等標​​志放在LDFLAGS的最後,你做了嗎? – 2012-05-06 04:02:10

+1

這可能也有幫助[here](http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s) – ervinbosenbacher

+3

另請注意'未定義符號'錯誤與正確或不正確的頭文件包含無關;他們是鏈接器錯誤,並顯示一些庫缺失。 – 2012-05-06 04:05:30

回答

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是真的,我覺得這條線:

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文件。爲此,您需要在源樹的最頂層目錄(其中configure.inconfigure.ac所在的位置)運行automake命令。爲確保您的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
希望這有助於!