PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C]Makro wegdefinieren?


Gast
2009-04-29, 20:06:47
Hallo,

ich stehe vor folgender Aufgabe: ich muss den Sourcecode einer C-Library auf einer etwas exotischen Plattform (OpenAT OS auf einer Wavecom "Wireless CPU", AFAIK ein ARM-Prozessor) compilieren. Da die mitgelieferten Makefiles meine Plattform natürlich nicht unterstützen, muss ich alles von Hand machen. Insbesondere ist mein Problem, dass zahllose Funktionsdeklarationen ein Makro mit dem Namen "EXPORT" vorangestellt haben, über das der Compiler meckert, weil es in keinem Header-File definiert ist, also z.B. so:
EXPORT JitterBuffer* jitter_buffer_init();
was der Compiler mit "Syntax error before 'JitterBuffer'" quittiert. Wie kann ich dieses Makro geeignet definieren, damit der Compiler nicht mehr meckert? Ich hab's schon mit

#define EXPORT __stdcall

versucht, aber das klappt auch nicht.

Besserwissend
2009-04-29, 21:24:00
Versuch mal

#define EXPORT extern volatile

noid
2009-04-29, 21:31:48
#define EXPORT __declspec(dllexport)
könnte auch ne Idee sein.

Xmas
2009-04-30, 00:17:26
Wie lautet denn die Definition von EXPORT für andere Plattformen? Und welchen Compiler nutzt du?

Gast
2009-04-30, 11:37:41
extern volatile hat nicht geklappt, weil einige Funktionen void zuürcklieferten und der Compiler bemängelte, das sei zu volatile inkompatibel. Aber extern alleine hat funktioniert :)

Die Definition von EXPORT für die anderen Plattformen habe ich nicht gefunden. Vielleicht könnt ihr mir suchen helfen, der Sourcecode liegt in

http://downloads.xiph.org/releases/speex/speex-1.2rc1.tar.gz

Ist ein Codec zur Komprimierung von Audiodaten. Der von mir benutzte Compiler ist AFAIK eine gcc-Variante, der ist bei der Entwicklungsumgebung Wavecom M2M Studio dabei:

http://www.wavecom.com/modules/movie/scenes/products/index.php?fuseAction=article&rubric=products_OpenATIDE&article=products_openAT_M2MStudio

Besserwissend
2009-04-30, 17:22:19
Die Definition von EXPORT für die anderen Plattformen habe ich nicht gefunden.

siehe Verzeichnis /speex-1.2rc1/win32 in der config.h

Das
#define EXPORT __declspec(dllexport)
könnte auch ne Idee sein.
war der richtige Riecher
Siehe auch dazu: http://gcc.gnu.org/wiki/Visibility um die Einstellungen für den (Original-)GCC vorzunehmen.

Falls es mit Deinem Übersetzer nicht funktioniert würde ich es einfach weglassen:

#define EXPORT

Gast
2009-04-30, 18:16:54
Das mit dem #define EXPORT hatte als allererstes versucht, das klappte aber auch nicht, da er Compiler das wohl als #define EXPORT 1 deutete und Fehlermeldungen mit "numerical constant" ausgab.

Derweil habe ich es dann doch so gemacht, dass ich alle EXPORT Makros entfernt habe, ging mit Find&Replace schneller als erwartet.

noid
2009-04-30, 19:04:44
Das mit dem #define EXPORT hatte als allererstes versucht, das klappte aber auch nicht, da er Compiler das wohl als #define EXPORT 1 deutete und Fehlermeldungen mit "numerical constant" ausgab.

Derweil habe ich es dann doch so gemacht, dass ich alle EXPORT Makros entfernt habe, ging mit Find&Replace schneller als erwartet.

Das ist ein seltsamer Compiler? Weil... eigentlich wenn schon, dann 0?

Gast
2009-05-01, 11:00:06
Also der ganz normale gcc definiert standardmäßig mit 1 und nicht mit 0
Keine Ahnung wie es mit anderen Compilern aussieht.

Besserwissend
2009-05-01, 14:31:18
Das mit dem #define EXPORT hatte als allererstes versucht, das klappte aber auch nicht, da er Compiler das wohl als #define EXPORT 1 deutete und Fehlermeldungen mit "numerical constant" ausgab.

Derweil habe ich es dann doch so gemacht, dass ich alle EXPORT Makros entfernt habe, ging mit Find&Replace schneller als erwartet.
Also der ganz normale gcc definiert standardmäßig mit 1 und nicht mit 0
Keine Ahnung wie es mit anderen Compilern aussieht.
:confused:


#include<stdio.h>
#define x

int main( void ) {
printf( "%d", x );
return 0;
}

sollte eigentlich bei jedem C Compiler mit vernünftigem Präprozessor mit einer Fehlermeldung abbrechen.
Bei Präprozessordirektiven gibt es eigentlich keine "standardmäßigen" Definitionen - es sind mehr oder weniger schlichte Zeichenkettenersetzungsoperationen.

Gast
2009-05-02, 17:59:33
Sorry mein Fehler. Hab es verwechselt mit der -D Option, damit wird es standardmäßig mit 1 definiert.
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Preprocessor-Options.html#Preprocessor-Options

Gast
2009-05-04, 10:57:45
ach, da gibt's nen Unterschied? Ich habe das Makro immer über die Projekteinstellungen des M2M Studio (verwendet vermutlich die D-Option) definiert, in der Annahme, das sei 100%ig äquivalent zu #define...

Ectoplasma
2009-05-04, 11:24:04
Im GCC ist das Equivalent zu #define EXPORT

gcc -DEXPORT=

Also einfach ein = Zeichen hinter das Makro setzten.

Hier noch ein wenig Code zum experimentieren.


#include <stdio.h>

#define to_string(v) #v
#define echo(v) to_string(v)

#define EXPORT World

int
main(int argc, char **argv) {
printf("Hello %s\n", echo(EXPORT));
return 0;
}