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
Ehemalige
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.
|