5 votes

y compris les fichiers d'en-tête en C et compiler

Je travaille sur un projet open source appelé snort qui est écrit en C, sous Linux. J'ai ouvert le projet dans netbeans correctement et maintenant je vais faire quelques changements dans ce code source. Le dossier src du programme contient plusieurs dossiers et aussi chaque dossier a quelques dossiers. J'ai entendu dire que netbeans est capable de générer des fichiers make. Je fais quelques changements dans les fichiers src du dossier XFolder et je veux utiliser une fonction de bibliothèque dans un autre dossier de mon projet (YFolder). J'ai inclus le fichier .h et utilisé la fonction correctement.

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

Maintenant, lorsque je peux compiler le programme, il est Ok, mais lorsque j'utilise les bibliothèques dynamiques ".so (shared object files)" qui ont été créées dans le processus make ; et que j'exécute le programme, je vois une erreur qui signifie que la fonction que j'ai utilisée à partir d'un autre dossier n'est pas définie et je vois cette erreur ; (sfxhash_new est le nom de la fonction externe que j'ai appelée).

libsf_sip_preproc.so : symbole non défini : sfxhash_new

J'ai également édité Makefile.am et ajouté les sources de ce paquet ( ../YFolder/lib.c and lib.h ) ; Mais pas efficace. Quelqu'un peut-il m'aider ?

EDIT :

Je suis dans le dossier src/dynamic-preprocessor/sip. Je veux utiliser une fonction dans le fichier : src/sfutil/sfxHash.c le nom de la fonction est sfxhash_new(... ... ...) J'ai inclus sfxHash.h correctement. J'ai fait quelques changements dans mon Makefile.am mais le makefile principal est le suivant.

Mon fichier 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

2voto

Après avoir effectué des changements dans Makefile.am les modifications ne sont pas prises en compte immédiatement (c'est-à-dire que si vous exécutez le fichier configure & make vous ne verrez pas les changements). Vous devez générer/mettre à jour le fichier Makefile.in d'abord. Pour cela, vous devez exécuter automake dans le répertoire le plus haut de l'arborescence des sources (où la commande configure.in o configure.ac réside). Pour s'assurer que votre Makefile.am Les changements pour inclure de nouvelles sources seront reflétés avec succès dans le build, vérifiez que libsf_sip_preproc_la_SOURCES est le même ensemble de fichiers dans Makefile.am ainsi que Makefile.in . Maintenant, exécutez configure et make des commandes.
Notez que l'ajout d'un fichier d'un endroit à un autre de l'arborescence des sources peut entraîner son propre ensemble de dépendances, à savoir sfxhash Les fichiers sources peuvent inclure des fichiers et se lier à des bibliothèques qui ne sont pas présentes dans le système de gestion de l'information. Makefile.am en question, auquel cas il vous faudra peut-être mettre à jour INCLUDES afin d'inclure le répertoire nécessaire à la source et/ou d'ajouter de nouvelles bibliothèques en libsf_sip_preproc_la_LIBADD . Évitez de mélanger .la & .a fichiers dans libsf_sip_preproc_la_LIBADD .
J'espère que cela vous aidera !

1voto

MYMNeo Points 788

Comme vous l'avez écrit :

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

si SO_WITH_STATIC_LIB est vrai, je pense que cette ligne :

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.la

devrait être

libsf_sip_preproc_la_LIBADD = ../libsf_dynamic_preproc.a

C'est mon idée, vous pouvez l'essayer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X