2016-09-30 2 views
0

Ich möchte ein Makefile für Windows- und Linux-Builds erstellen. Das Problem ist, dass ich für jede Plattform mit verschiedenen dynamischen Bibliotheken verlinken muss. Der C-Präprozessor kann einige nette Variablen haben, zum Beispiel _WIN32. Wie extrahiert man diese Informationen?Variablen aus C-Präprozessor in Makefile importieren

Die Lösung muss mit einem Cross-Compiler arbeiten. Ich kann kein kleines Programm erstellen und dann ausführen. Ich habe nur eine, andere Variable, die CC, die Umgebung kann die gleiche sein.

Der umgekehrte Weg ist einfach, der -D Schalter.


ähnliche, aber verschiedene Fragen:

Makefile that distincts between Windows and Unix-like systems
Ich verwende das gleiche Programm make. Nur die CC Variable ist unterschiedlich.

+0

möglich Duplikat http definiert: // Stackoverflow .com/questions/4058840/makefile-that-distincts-zwischen-windows-und-unix-like-systems – racraman

+0

@racraman Die Frage bezieht sich auf native Build-Umgebungen. Ich habe einen Cross-Compiler. (Ich habe die Frage ein wenig bearbeitet.) – Michas

Antwort

0

auf Antwort Basierend von TTK

mit Variablen Datei erstellen, so etwas wie dieses:

#ifdef _WIN32 
-lgdi32 -lopengl32 
#else 
-lpthread -lX11 -lXxf86vm -lXcursor -lXrandr -lXinerama -lXi -lGL 
#endif 

Und so etwas zu Makefile:

A_FLAGS = $(strip $(shell $(CPP) -P $(CPPFLAGS) ./a_flags.cpp)) 
# or 
A_FLAGS = $(strip $(shell $(CPP) -P -xc $(CPPFLAGS) ./a_flags)) 

$(CPP) - die C-Präprozessor ausführbar, sollte durch das Make-Programm definiert werden am
-P - die Flagge Generation von linemarkers
-xc zu hemmen - das Flag Präprozessor zu zwingen Datei als C-Quelle
$(CPPFLAGS) zu behandeln - optional Flags für den Prä-Prozessor durch Programmierer

1

Ich weiß nicht, ob Sie diese Variablen direkt bekommen können, aber Sie können diese Lösung versuchen:

CPP=i686-w64-mingw32-cpp 
CPPFLAGS= -P 
WIN32=$(shell echo _WIN32 | $(CPP) $(CPPFLAGS)) 

iswin32: 
    @echo $(WIN32) 

Dieses Beispiel gibt 1:

$ make iswin32 
1 

Wenn Sie mit mehreren Erklärungen zu tun haben, Berücksichtigen Sie auch, dass Sie eine Datei mit allen Deklarationen erstellen, sie vorverarbeiten und in ein Makefile einbeziehen.

$ cat declaration 
WIN32 = _WIN32 
+1

Der Code funktioniert nicht, ich habe 'cc: fataler Fehler: keine Eingabedateien', aber die Flag -P ist genug Hilfe für mich. – Michas

+0

Dies liegt daran, dass 'gcc' standardmäßig nicht von der stdin liest. Versuchen Sie, das Flag '-xc-' hinzuzufügen, damit 'gcc' von' stdin' liest und die Sprache vorschlägt (in diesem Fall C). – TTK

Verwandte Themen