ubuntuusers.de

Problem mit gcc-4.3.2 "malloc" "free" nicht definiert

Status: Gelöst | Ubuntu-Version: Ubuntu 8.10 (Intrepid Ibex)
Antworten |

arminius82

Anmeldungsdatum:
1. Juni 2007

Beiträge: Zähle...

Versuche verzweifelt ICE (C++-Bildverarbeitungs-Bibliothek) zu Kompilieren. Leider kommt folgende Fehlermeldung:

vectort.h: In member function »void ice::VectorT<T>::alloc(int)«:
vectort.h:77: Fehler: es gibt keine Argumente für »malloc«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »malloc« verfügbar sein muss
vectort.h:77: Fehler: (mit »-fpermissive« wird G++ den Code akzeptieren, aber die Verwendung eines nicht deklarierten Namens ist veraltet)
In file included from affinfit.cpp:35:
lmdif.h: At global scope:
lmdif.h:68: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
lmdif.h:71: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
lmdif.h:76: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In destructor »ice::VectorT<T>::~VectorT() [with T = double]«:
geo_ob.h:58:   instantiated from here
vectort.h:151: Fehler: »free« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In member function »ice::VectorT<T>& ice::VectorT<T>::operator=(const ice::VectorT<T>&) [with T = double]«:
fitfn.h:66:   instantiated from here
vectort.h:169: Fehler: »free« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h:173: Fehler: »malloc« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In member function »void ice::VectorT<T>::alloc(int) [with T = double]«:
vectort.h:109:   instantiated from »ice::VectorT<T>::VectorT(T, T) [with T = double]«
geo_ob.h:58:   instantiated from here
vectort.h:77: Fehler: »malloc« wurde in diesem Gültigkeitsbereich nicht definiert
make: *** [some_machine/obj/affinfit.o] Fehler 1

Komischerweise erst seit dem ich von Ubuntu 8.04 zu 8.10 gewechselt habe. Habe die Vermutung das es sich um ein Fehler des C++ Compilers handelt, da 8.04 eine ältere Version des gcc verwendet. Meine gcc Version ist 4.3.2.

Kennt ihr eine Lösung für mein prob? Bzw. Wie kann ich "make" dazu bringen eine ältere Version vom gcc-Compiler zu verwenden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4673

Wohnort: Berlin

@arminius82: Ich würde mal eher vermuten das der Quelltext fehlerhaft ist und der neue g++ diese Fehler nicht mehr akzeptiert. Lies Dir doch zum Beispiel mal die ersten drei Zeilen durch, die Du uns zeigst. Die enthalten sogar einen Hinweis was man machen könnte.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Was ist an mit »-fpermissive« wird G++ den Code akzeptieren so schwer zu verstehen?

Übrigens gibt es in den Ubuntu-Repositories eine libice6, ist das die Bibliothek, die Du brauchst? Dann solltest Du auch die Version aus den Repos nutzen.

arminius82

(Themenstarter)

Anmeldungsdatum:
1. Juni 2007

Beiträge: 12

Also -fpermissive ist leider nicht definiert

 make -fpermissive
make: permissive: No such file or directory
make: *** Keine Regel, um »permissive« zu erstellen.  Schluss.

Und libice6 ist leider nicht die Bibliothek die ich brauche. Meine ICE-Bibliothek → http://www.inf-cv.uni-jena.de/ice/ice.html

Wie kann ich denn make dazu bringen eine älter gcc-Version zu nutzten?

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Das ist ne gcc-Option und keine make-Option.

Schau dir mal das Makefile an, da müsste es eine Variable geben die die GCC-Optionen enthalten. Dort kannst du das -fpermissive eintragen. Die Variable heißt meistens glaube ich COMPILERFLAGS, oder eine Abkürzung davon.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

In der Regel kann man zusätzliche Compilerflags einstellen, indem man die Umgebungsvariablen CXXFLAGS oder CCFLAGS verändert.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Wie die Variable heißt, liegt völlig in der Hand des Programmierers, in diesem Fall ist es weder COMPILERFLAGS noch eine Abkürzung davon, sondern "COPT". Diese Variable wird in Zeile 67 definiert, dort ließe sich -fpermissive hinzufügen. Allerdings ist das nur eine Zwischenlösung, den schon gcc 4.3.3 akzeptiert den Code selbst mit -fpermissive nicht mehr, zumindest nicht auf meinem Gentoo-System.

Die andere Möglichkeit wäre, in Zeile 14 die Variable CXX dahingehend zu ändern, dass ein älterer g++ zum Einsatz kommt.

Wie dem auch sei, faktisch ist das ein Bug dieser Bibliothek und liegt daher in der Verantwortung der Maintainer.

Edit: Hello World, das geht doch nur, wenn diese Variablen vom Makefile oder vom Buildsystem verarbeitet werden. Da diese Bibliothek weder autotools noch irgendein anderes Buildsystem nutzt, sondern ein handgeschriebenes Makefile, kommt man doch nicht umhin, dieses zu editieren, oder sehe ich das falsch?

arminius82

(Themenstarter)

Anmeldungsdatum:
1. Juni 2007

Beiträge: 12

Coole Idee, leider ohne Erfolg.

make
mkdir -p some_machine/obj
mkdir -p ../lib/some_machine
mkdir -p some_machine/objvis
mkdir -p some_machine/deps
mkdir -p some_machine/depsvis
g++ -I.  -DNOSCANV4L -g -Wall -fpermissive -c affinfit.cpp -o some_machine/obj/affinfit.o
In file included from VectorO.h:24,
                 from MatrixO.h:24,
                 from contur.h:32,
                 from fit.h:31,
                 from affinfit.h:30,
                 from affinfit.cpp:27:
vectort.h: In member function »void ice::VectorT<T>::alloc(int)«:
vectort.h:77: Warnung: es gibt keine Argumente für »malloc«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »malloc« verfügbar sein muss
In file included from affinfit.cpp:35:
lmdif.h: At global scope:
lmdif.h:68: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
lmdif.h:71: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
lmdif.h:76: Fehler: »INT_MAX« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In destructor »ice::VectorT<T>::~VectorT() [with T = double]«:
geo_ob.h:58:   instantiated from here
vectort.h:151: Fehler: »free« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In member function »ice::VectorT<T>& ice::VectorT<T>::operator=(const ice::VectorT<T>&) [with T = double]«:
fitfn.h:66:   instantiated from here
vectort.h:169: Fehler: »free« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h:173: Fehler: »malloc« wurde in diesem Gültigkeitsbereich nicht definiert
vectort.h: In member function »void ice::VectorT<T>::alloc(int) [with T = double]«:
vectort.h:109:   instantiated from »ice::VectorT<T>::VectorT(T, T) [with T = double]«
geo_ob.h:58:   instantiated from here
vectort.h:77: Fehler: »malloc« wurde in diesem Gültigkeitsbereich nicht definiert
make: *** [some_machine/obj/affinfit.o] Fehler 1

Eventuell habe ich die Option aber auch an der falschen Stelle gesetzt. Makefile:

###########################################
#     		ICE Makefile              #
###########################################
#
# If you want to exclude visualization 
# routines from the library, just define
# the variable NOVISUAL with :
#		make NOVISUAL=1
# This is the only way to use the ICE 
# library without wxWidgets
#
###########################################

CXX=g++
SUBDIRS := devices ocr
NOSCANV4L := 1
#NOSCANFW := 0

ifdef OSTYPE
ifeq ($(OSTYPE),msys)
# msys / mingw
NOSCANV4L := 1
NOSCANFW := 1
OPT := -O2 $(OPT) 
endif
endif

ifdef NOSCANV4L
OPT := $(OPT) -DNOSCANV4L
else
SUBDIRS += scan_v4l
endif

ifdef NOSCANFW
OPT := $(OPT) -DNOSCANFW
else
SUBDIRS += scan_fw
endif

ifdef NOFFTW3
OPT := $(OPT) -DNOFFTW3
endif

ifndef MACHTYPE
MACHTYPE := some_machine
endif

OBJDIR := $(MACHTYPE)/obj
DEPDIR := $(MACHTYPE)/deps

OBJVISDIR := $(MACHTYPE)/objvis
DEPVISDIR := $(MACHTYPE)/depsvis
VISDIR := visual

LIBDIR := ../lib/$(MACHTYPE)

VPATH := $(SUBDIRS)

ifdef OPTIMIZED
OPT := $(OPT) -O3 -DOPTIMIZED 
endif

ifdef NOVISUAL
OPT := $(OPT) -DNOVISUAL
endif

COPT := $(OPT) -g -Wall -fpermissive
COPTVIS := $(OPT) -g -Wall `wx-config --cxxflags` -fno-strict-aliasing 

INCLUDE := -I.
INCLUDEVIS := -I. -Ivisual

SRC := $(wildcard *.cpp)
SRCVIS := $(wildcard $(VISDIR)/*.cpp)

include $(patsubst %, %/module.mk, $(SUBDIRS))

OBJ := $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SRC)))
DEP := $(patsubst %.cpp,$(DEPDIR)/%.d,$(notdir $(SRC)))

OBJVIS := $(patsubst %.cpp,$(OBJVISDIR)/%.o,$(notdir $(SRCVIS)))
DEPVIS := $(patsubst %.cpp,$(DEPVISDIR)/%.d,$(notdir $(SRCVIS)))

$(OBJDIR)/%.o:	%.cpp
#	@echo "** compiling non-visual source $<"
	$(CXX) $(INCLUDE) $(COPT) -c $< -o $@

$(OBJVISDIR)/%.o: $(VISDIR)/%.cpp
#	@echo "** compiling visual source $<"
	$(CXX) $(INCLUDEVIS) $(COPTVIS) -c $< -o $@

# Standard-Ziel
ifndef NOVISUAL
all: preparation buildlib
	@echo "The library was built successfully."
else
all: preparation buildlibnovis
	@echo "The library was built successfully WITHOUT visualization."
endif

preparation:
	mkdir -p $(OBJDIR)
	mkdir -p $(LIBDIR)
	mkdir -p $(OBJVISDIR)
	mkdir -p $(DEPDIR)
	mkdir -p $(DEPVISDIR)

buildlib: $(OBJ) $(OBJVIS)
	-rm $(LIBDIR)/libice.a
	ar ruvs $(LIBDIR)/libice.a $(OBJ) $(OBJVIS)
	ranlib $(LIBDIR)/libice.a

buildlibnovis: $(OBJ)
	ar ruvs $(LIBDIR)/libice.a $(OBJ)
	ranlib $(LIBDIR)/libice.a

$(DEPDIR)/%.d: %.cpp
	mkdir -p $(DEPDIR)
	@echo "** building dependencies of $< (non-visual)"
	./depend.sh `dirname $*.cpp` $(OBJDIR) $(COPT) $(INCLUDE) $< > $@

-include $(DEP)

ifndef NOVISUAL

$(DEPVISDIR)/%.d: $(VISDIR)/%.cpp
	mkdir -p $(DEPVISDIR)
	@echo "** building dependencies of $< (visual)"
	./depend.sh `dirname $(VISDIR)/$*.cpp` $(OBJVISDIR) $(COPTVIS) $(INCLUDEVIS) $< > $@

-include $(DEPVIS)

endif

dep:
	# "make dep ist nicht mehr erforderlich!"

clean:
	-rm -f $(OBJDIR)/*.o
	-rm -f $(DEPDIR)/*.d
	-rm -f $(OBJVISDIR)/*.o
	-rm -f $(DEPVISDIR)/*.d

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Lunar schrieb:

Edit: Hello World, das geht doch nur, wenn diese Variablen vom Makefile oder vom Buildsystem verarbeitet werden. Da diese Bibliothek weder autotools noch irgendein anderes Buildsystem nutzt, sondern ein handgeschriebenes Makefile, kommt man doch nicht umhin, dieses zu editieren, oder sehe ich das falsch?

Nein, Du hast völlig recht. Ich hatte ja bewusst in der Regel geschrieben, da ichmir das Buildsystem dieser Bibliothek nicht angeschaut hatte.

arminius82

(Themenstarter)

Anmeldungsdatum:
1. Juni 2007

Beiträge: 12

Welchen Ordner muss ich denn für die Variabel CXX=g++ (Makefile), also den gcc Compiler, angeben wenn ich den gcc 4.2.4 benutzen will. Bzw. Wo finde ich den Ordner.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Ich hab das Ding mal geflickt, im Anhang ist ein patch. Anwenden im src-Verzeichnis mit patch -p1 < ice. Mir ist egal, was Du damit machst, meinetwegen kannst Du's an den Autor weitergeben.

ice (3.2 KiB)
Download ice

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

arminius82 schrieb:

Welchen Ordner muss ich denn für die Variabel CXX=g++ (Makefile), also den gcc Compiler, angeben wenn ich den gcc 4.2.4 benutzen will.

Wenn das Paket g++-4.2 installiert ist, reicht es CXX=g++-4.2 einzutragen.

arminius82

(Themenstarter)

Anmeldungsdatum:
1. Juni 2007

Beiträge: 12

Hey super! vielen Dank an alle!

Das mit den Patch werde ich die tage auch mal ausprobieren!

The library was built successfully.
Antworten |