2010-08-19 6 views
12

Theoretisch ist es sehr einfach, eine Win32-Anwendung mit einer Ressourcendatei mithilfe von cmake zu erstellen. In einem add_executable Befehl kann eine Ressourcendatei so einfach wie eine C- oder C++ - Quelldatei aufgelistet werden. Beim Erstellen mit MinGW-Tools ist jedoch ein bekannter Fehler bekannt.Wie erstelle ich eine Win32-App mit einer Ressourcendatei mit Cmake und MinGW?

fand ich eine Abhilfe, die die folgenden in CMakeFiles.txt enthalten ist ...

if(MINGW) 
    set(CMAKE_RC_COMPILER_INIT windres) 
    ENABLE_LANGUAGE(RC) 
    SET(CMAKE_RC_COMPILE_OBJECT 
     "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>") 
endif(MINGW) 

Leider scheint dies nicht zu arbeiten. Was scheint zu passieren ist, dass windres erzeugt eine <whatever>.rc.res Datei, die ld nicht versteht.

Bei meinen Suchen habe ich den starken Verdacht entwickelt, dass Win32-Unterstützung als sehr niedrige Priorität angesehen wird, insbesondere außerhalb von Visual Studio. Dies ist verständlich, da Win32 offensichtlich nicht so wichtig ist wie früher. Und natürlich sind Visual Studio Express Editions kostenlos verfügbar.

Trotzdem wäre es für mich bequem, wenn ich MinGW GCC für ein paar alte Win32-Apps verwenden könnte, die ich noch benutze. Wenn nichts anderes, kann ich GCOV Test Coverage Statistiken erhalten.

Offensichtlich, wenn alles andere fehlschlägt, könnte ich immer mit Ressourcendateien mit einem benutzerdefinierten Build-Befehl umgehen. Ein Problem ist, dass ich weder mit windres oder ld vertraut bin, noch wie MinGW mit Win32-Ressourcendateien umgehen soll. Ein anderes ist, dass ich das Rad nicht wirklich neu erfinden möchte, wenn jemand bereits ein überlegenes Rad hat, das sie mit mir teilen möchten.

Also das ist es im Grunde - wie kann ich Win32-Anwendungen mit Ressourcen-Dateien mit Cmake und MinGW (aber nicht brechen Unterstützung für Visual Studio) unterstützen?

Antwort

6

denke ich, ist Ihr Problem hier:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE> 

Vielleicht sollten Sie so etwas schreiben:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT> 

oder mehr formal:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT> 

Die anderen möglichen Probleme könnten sei mit - welche Erweiterung macht Ersatz? Da windress das benötigte Ausgabedateiformat daraus erraten wird.

Referenzen sind hier: www.mingw.org/wiki/MS_resource_compiler

"res" -Dateien sind unappropriate für ld, wie Sie bereits wissen, und das windres Beispiel sourceware.org/binutils/docs/binutils/windres.html

windres Mann

EDIT von Frage Autor ...

Der feste cmake Codeausschnitt ist wie folgt ...

if(MINGW) 
    set(CMAKE_RC_COMPILER_INIT windres) 
    ENABLE_LANGUAGE(RC) 
    SET(CMAKE_RC_COMPILE_OBJECT 
    "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") 
endif(MINGW) 

Es sollte wohl ein Flags Variable anstatt Einsetzen der -O Option in der Befehlsvorlage werden Einstellung, aber das funktioniert.

+0

Danke für die Antwort. Ich bin beschäftigt ATM, so dass es ein paar Tage dauern kann, bevor ich das noch einmal untersuchen kann.Eine Sache, auf die ich hinweisen werde - ich habe versucht, cmake zu sagen, eine andere Erweiterung zu verwenden. Es gibt eine Variable, die angibt, welche Erweiterung verwendet wird, und ich habe versucht, das nach der 'enable_language' oben zu ändern, zusammen mit der Änderung des which-compilers. cmake ging weiter und benutzte '.res' sowieso - weiß nicht warum. Anyway, +1, weil an dieser Stelle alles hilfreich ist, aber es kann eine Weile dauern, bevor ich es ausprobiere. – Steve314

+0

Ich habe die Zeit, damit wieder zu spielen, und es stellt sich heraus, dass das Hauptproblem ist, dass, obwohl ich dies als ein Dateiformat Problem beschrieben habe ich zuerst/vor allem als Dateierweiterung Problem gedacht. Die Lösung bestand darin, das Handbuch von windres erneut zu lesen, und es war sinnvoll, das Coff-Ausgabeformat mit "-Ocoff" zu spezifizieren, unabhängig von der Dateierweiterung. Ich hätte wahrscheinlich die Variable cmake für RC-Flags herausfinden sollen, aber nachdem die Dateierweiterungsvariable nicht funktionierte, habe ich einfach die Option in den Template-Befehl eingefügt. – Steve314

+0

Ich hoffe, es macht Ihnen nichts aus, dass ich ein wenig zu Ihrer Antwort hinzufüge, bevor ich sie akzeptiere. – Steve314