[Problem] Fehler beim Kompilieren der Host-Tools für 7270/7570 - LZMA

pengu

Mitglied
Mitglied seit
18 Sep 2008
Beiträge
644
Punkte für Reaktionen
0
Punkte
0
nach einiger Zeit Freetz-Abstinenz und Problemen mit einer meiner 7270 wollt ich es nun wieder wagen, doch habe ich mit dem aktuellen Trunk ein Problem beim Kompilieren von LZMA.

Auch ein make dir- oder distclean hilft nicht.

Es kommt entweder zu dem einen oder anderen Fehler:

Code:
make -j2 -C /data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib
make[1]: Entering directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
g++ -O3 -Wall -c  -I ../../../ ZLib.cpp
g++ -O3 -Wall -c  -I ../../../ ../LZMA/LZMAEncoder.cpp
ZLib.cpp:183:31: Fehler: expected initializer before »OF«
make[1]: *** [ZLib.o] Fehler 1
make[1]: *** Warte auf noch nicht beendete Prozesse...
../LZMA/LZMAEncoder.cpp: In Elementfunktion »LONG NCompress::NLZMA::CEncoder::GetOptimumFast(UInt32, UInt32&, UInt32&)«:
../LZMA/LZMAEncoder.cpp:1207:68: Warnung: suggest parentheses around »&&« within »||«
../LZMA/LZMAEncoder.cpp:1208:69: Warnung: suggest parentheses around »&&« within »||«
../LZMA/LZMAEncoder.cpp:1223:82: Warnung: suggest parentheses around »&&« within »||«
../LZMA/LZMAEncoder.cpp:1225:97: Warnung: suggest parentheses around »&&« within »||«
make[1]: Leaving directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
make: *** [/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib/liblzma.a] Fehler 2
Code:
make -j2 -C /data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib
make[1]: Entering directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
g++ -O3 -Wall -c  -I ../../../ ZLib.cpp
g++ -O3 -Wall -c  -I ../../../ ../LZ/LZInWindow.cpp
ZLib.cpp:183:31: Fehler: expected initializer before »OF«
make[1]: *** [ZLib.o] Fehler 1
make[1]: *** Warte auf noch nicht beendete Prozesse...
make[1]: Leaving directory `/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib'
make: *** [/data/source/7270/SP/freetz-trunk/source/host-tools/lzma443/C/7zip/Compress/LZMA_Lib/liblzma.a] Fehler 2
Anfangs dachte ich es könnte evtl am GCC liegen, also habe ich es mit dem 4.4.6 und 4.5.3 probiert, mit dem selben Ergebnis.

Wie vielleicht schon aus früheren Beiträgen ersichtlich verwende ich ein aktuelles Gentoo Linux und hatte seit einem Jahr keine Probleme beim Kompilieren von Freetz.

Wenn ich ein Image für die 7170 baue, läuft alles, was wohl an der älteren LZMA Version liegt.

Hier noch ein paar Daten zu meinem System:

Code:
Portage 2.1.10.27 (default/linux/amd64/10.0/desktop, gcc-4.5.3, glibc-2.13-r4, 3.0.6-gentoo x86_64)
=================================================================
System uname: Linux-3.0.6-gentoo-x86_64-AMD_Athlon-tm-_II_X2_220_Processor-with-gentoo-2.1
Timestamp of tree: Fri, 14 Oct 2011 22:15:01 +0000
app-shells/bash:          4.2_p10
dev-java/java-config:     2.1.11-r3
dev-lang/python:          2.6.7-r2, 2.7.2-r3, 3.1.4-r3, 3.2.2
dev-util/cmake:           2.8.5-r2
dev-util/pkgconfig:       0.26
sys-apps/baselayout:      2.1
sys-apps/openrc:          0.9.3-r1::poly-c
sys-apps/sandbox:         2.5
sys-devel/autoconf:       2.13, 2.68
sys-devel/automake:       1.6.3-r1, 1.8.5-r4, 1.9.6-r3, 1.10.3, 1.11.1-r1
sys-devel/binutils:       2.21.1-r1
sys-devel/gcc:            4.4.6-r1, 4.5.3-r1
sys-devel/gcc-config:     1.4.1-r1
sys-devel/libtool:        2.4-r3
sys-devel/make:           3.82-r3
sys-kernel/linux-headers: 2.6.39 (virtual/os-headers)
sys-libs/glibc:           2.13-r4

Ich werde das bei Gelegenheit mal auf einem aktuellen Ubuntu oder Debian System gegentesten.


Erste Recherchen haben leider noch nichts ergeben, sonst hätte ich das Problem schon selbst gelöst.
 

RalfFriedl

IPPF-Urgestein
Mitglied seit
22 Apr 2007
Beiträge
12,343
Punkte für Reaktionen
1
Punkte
0
Das Makro OF wird bei mir in /usr/include/zconf.h:166 definiert.
Die Verwendung diese Makros an dieser Stelle ist absolut unsinnig, das Beste wäre, es zu entfernen.
 

olistudent

IPPF-Urgestein
Mitglied seit
19 Okt 2004
Beiträge
14,779
Punkte für Reaktionen
10
Punkte
38
Was macht das Macro?
Code:
#ifndef OF /* function prototypes */
#  ifdef STDC
#    define OF(args)  args
#  else
#    define OF(args)  ()
#  endif
#endif
Könnte man da einfach OF() weglassen und nur die Parameter stehen lassen?

Gruß
Oliver
 

RalfFriedl

IPPF-Urgestein
Mitglied seit
22 Apr 2007
Beiträge
12,343
Punkte für Reaktionen
1
Punkte
0
Das Makro macht nichts sinnvolles und gehört an der Stelle (Definition einer Funktion) nicht hin.

Bei der Deklaration einer Funktion kann man damit den Code kompatibel zu alten (uralten) Compilern machen, aus der Zeit vor C89, vielleicht noch vorher. Daher auch der Test auf STDC (Standard C).

Zu Zeiten des ursprünglichen K&R C hat man Funktionen so geschrieben:
Code:
/* Deklaration: */
extern int func ();
/* Definition */
int func ()
int param;
{
  return param;
}
Seit mindestens 20 Jahren schreibt man es so:
Code:
/* Deklaration: */
extern int func (int param);
/* Definition */
int func (int param)
{
  return param;
}
Die Deklaration kann man mit dem Makro vereinheitlichen:
Code:
/* Deklaration: */
extern int func OF((int param));
Damit wird entweder die alte oder die neue Form erzeugt. Wenn man aber das Makro in der Definition der Funktion verwendet, kommt das heraus:
Code:
/* Definition */
int func ()
{
  return param;
}
Und das kann niemals funktionieren, weil der Parameter nicht definiert wird.

Man sieht daran, dass dieses Stück Programm noch nie mit einem alten Compiler übersetzt wurde

Die andere Frage ist, warum hier auf dem Build-System das Makro nicht definiert wird.
 

pengu

Mitglied
Mitglied seit
18 Sep 2008
Beiträge
644
Punkte für Reaktionen
0
Punkte
0
@ RalfFridl
Da geb ich dir recht.
Und genau da ist das Problem.
Nach näherer Untersuchung fand ich bereits am Sonntag Abend heraus, dass genau da das Problem liegt.
Bis zur Zlib Version 1.2.3 ist das auch so, doch genau das änderte sich in Version >=1.2.5.
Dort wurde das Makro in _Z_OF unbenannt.

Code:
#ifndef _Z_OF /* function prototypes */
#    define _Z_OF(args)  args
#    define _Z_OF(args)  ()

Durch das Umbenennen das nicht mehr:

Code:
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
                                  const Bytef *source, uLong sourceLen,
                                  int level))
{
 
Zuletzt bearbeitet:

RalfFriedl

IPPF-Urgestein
Mitglied seit
22 Apr 2007
Beiträge
12,343
Punkte für Reaktionen
1
Punkte
0
Damit ist schon mal geklärt, warum das Makro jetzt nicht mehr definiert ist.

Bevor man aber den Namen jetzt ändert, ist es besser, das Makro komplett zu entfernen.
 

pengu

Mitglied
Mitglied seit
18 Sep 2008
Beiträge
644
Punkte für Reaktionen
0
Punkte
0
Entfernen ist eine Idee, oder die zlib (1.2.3) in die Host-Tools zu nehmen und explizit verwenden.
Diese muss vor der LZMA lib gebaut werden (da diese von zlib abhängt)
 
Zuletzt bearbeitet:

olistudent

IPPF-Urgestein
Mitglied seit
19 Okt 2004
Beiträge
14,779
Punkte für Reaktionen
10
Punkte
38
@Ralf
So?

Code:
Index: tools/make/patches/100-lzma_zlib.lzma.patch
===================================================================
--- tools/make/patches/100-lzma_zlib.lzma.patch	(revision 7808)
+++ tools/make/patches/100-lzma_zlib.lzma.patch	(working copy)
@@ -311,9 +311,9 @@
 +	UInt64 m_offset;
 +};
 +
-+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
++ZEXTERN int ZEXPORT compress2 (Bytef *dest,   uLongf *destLen,
 +                                  const Bytef *source, uLong sourceLen,
-+                                  int level))
++                                  int level)
 +{
 +	CInMemoryStream *inStreamSpec = new CInMemoryStream(source, sourceLen);
 +	CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
@@ -374,8 +374,8 @@
 +	return Z_OK;
 +}
 +
-+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
-+                                   const Bytef *source, uLong sourceLen))
++ZEXTERN int ZEXPORT uncompress (Bytef *dest,   uLongf *destLen,
++                                   const Bytef *source, uLong sourceLen)
 +{
 +	CInMemoryStream *inStreamSpec = new CInMemoryStream(source, sourceLen);
 +	CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
Gruß
Oliver
 

RalfFriedl

IPPF-Urgestein
Mitglied seit
22 Apr 2007
Beiträge
12,343
Punkte für Reaktionen
1
Punkte
0
Genau so.

Es scheint auch die einzige Stelle zu sein, wo diesen Makro verwendet wird. Es gibt nicht einmal irgendwo eine Deklaration, für diese Funktionen oder für andere, wo das Makro verwendet wird.

Es gibt unter http://www.7-zip.org/sdk.html inzwischen eine Version 9.20, von daher bringt es wohl nicht, das dem Autor zu schreiben. Die aktuelle Version enthält jedenfalls kein OF Makro mehr.
 

Zurzeit aktive Besucher

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
233,299
Beiträge
2,032,527
Mitglieder
351,841
Neuestes Mitglied
henkno