2012-05-06 44 views
5

Tôi đang làm việc với một dự án nguồn mở được gọi là snort, được viết bằng C, dưới Linux. Tôi đã mở dự án trong netbeans một cách chính xác và bây giờ tôi sẽ làm một số thay đổi trong mã nguồn này. Thư mục src của chương trình chứa một số thư mục và mỗi thư mục có một số thư mục. Tôi nghe nói rằng netbeans có thể tạo ra các tập tin. Tôi đang làm một số thay đổi trong các tập tin src trong thư mục XFolder và muốn sử dụng một chức năng thư viện trong một thư mục khác trong dự án của tôi (YFolder). Tôi đã bao gồm tập tin .h và sử dụng đúng chức năng.bao gồm các tệp tiêu đề trong C và biên dịch

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

Bây giờ khi tôi có thể biên dịch chương trình, Ok, nhưng khi tôi sử dụng thư viện động ".so (tệp đối tượng được chia sẻ)" được tạo trong quá trình thực hiện; và chạy chương trình, tôi thấy lỗi có nghĩa là chức năng tôi đã sử dụng từ thư mục khác không được xác định và thấy lỗi này; (sfxhash_new là tên của hàm bên ngoài mà tôi đã gọi).

libsf_sip_preproc.so: undefined symbol: sfxhash_new

Tôi cũng sửa Makefile.am và bổ sung các nguồn của gói đó (../YFolder/lib.c and lib.h); Nhưng không hiệu quả. Có ai có thể giúp tôi không?

EDIT:

Tôi đang ở thư mục src/dynamic-Preprocessor/ngụm Tôi muốn sử dụng một hàm trong file: src/sfutil/sfxHash.c tên hàm là sfxhash_new (... .. . ...) Tôi đã bao gồm chính xác sfxHash.h. Tôi đã thực hiện một số thay đổi Trong Makefile.am của tôi nhưng makefile chính là điều này.

My Makefile.am file:

## $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

Bạn phải đặt cờ '-lnet -lpcre' v.v. vào cuối của LDFLAGS, bạn đã làm điều đó chưa? –

+1

Điều này có thể giúp quá [ở đây] (http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s) – ervinbosenbacher

+3

Cũng lưu ý lỗi 'biểu tượng không xác định' không có gì liên quan đến việc bao gồm tệp tiêu đề chính xác hoặc không chính xác; chúng là lỗi liên kết và cho thấy một số thư viện bị thiếu. –

Trả lời

1

Như bạn đã viết:

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 

nếu SO_WITH_STATIC_LIB là đúng, tôi nghĩ dòng này:

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la 

nên

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a 

đó là ý tưởng của tôi, bạn có thể thử nó.

+1

Điều đó không đúng. Tệp '.la' là các tệp lưu trữ libtool, chúng được sử dụng bởi' libtool' để tạo cả thư viện tĩnh và động theo nhu cầu –

2

Sau khi thực hiện thay đổi trong Makefile.am tệp, các thay đổi không được phản ánh ngay lập tức (tức là nếu bạn chạy configure & make bạn sẽ không thấy thay đổi). Bạn nên tạo/cập nhật tệp Makefile.in tương ứng trước tiên. Để làm điều đó, bạn cần chạy lệnh automake trong thư mục trên cùng của cây nguồn (trong đó configure.in hoặc configure.ac cư trú). Để đảm bảo rằng các thay đổi Makefile.am của bạn để bao gồm các nguồn mới sẽ được phản ánh thành công trong bản dựng, hãy kiểm tra rằng libsf_sip_preproc_la_SOURCES là cùng một tập hợp các tệp trong Makefile.am cũng như Makefile.in. Bây giờ, hãy chạy các lệnh configuremake.
Lưu ý rằng việc thêm tệp từ địa điểm này sang địa điểm khác trong cây nguồn có thể mang tập hợp phụ thuộc riêng của mình tức là sfxhash tệp nguồn có thể bao gồm các tệp & liên kết đến các thư viện không có trong số Makefile.am. có thể phải cập nhật INCLUDES để bao gồm thư mục cần thiết bởi nguồn và/hoặc thêm thư viện mới trong libsf_sip_preproc_la_LIBADD.Tránh trộn .la & .a tệp trong libsf_sip_preproc_la_LIBADD.
Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan