Wie füge ich einer kompilierten ausführbaren Datei von mingw-gcc ein Symbol hinzu?


86

Gibt es unter Windows unter Verwendung von mingws gcc trotzdem die Möglichkeit, anzugeben, dass die Ausgabe-Exe-Datei eine Symboldatei aufnehmen soll, damit die Exe-Datei mit diesem Symbol im Explorer angezeigt wird?

Antworten:


181

Sie müssen zuerst das Symbol erstellen. Dann müssen Sie eine RC-Datei mit dem folgenden Inhalt erstellen. Hier nennen wir es my.rc.

id ICON "path/to/my.ico"

Der idim obigen Befehl erwähnte kann so ziemlich alles sein. Es spielt keine Rolle, es sei denn, Sie möchten in Ihrem Code darauf verweisen. Führen Sie dann die Windres wie folgt aus:

windres my.rc -O coff -o my.res

Fügen Sie dann beim Erstellen der ausführbaren Datei zusammen mit anderen Objektdateien und Ressourcendateien das hinzu, my.reswas wir aus dem obigen Schritt erhalten haben. z.B:

g++ -o my_app obj1.o obj2.o res1.res my.res

Und das sollte alles sein, was dazu gehört.


Wenn Sie ohne Aufpreis Versionsinformationen in Ihre Anwendung aufnehmen möchten, fügen Sie einer neuen .rcDatei das folgende Boilerplate hinzu und befolgen Sie die oben genannten Schritte.

1 VERSIONINFO
FILEVERSION     1,0,0,0
PRODUCTVERSION  1,0,0,0
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904E4"
    BEGIN
      VALUE "CompanyName", "My Company Name"
      VALUE "FileDescription", "My excellent application"
      VALUE "FileVersion", "1.0"
      VALUE "InternalName", "my_app"
      VALUE "LegalCopyright", "My Name"
      VALUE "OriginalFilename", "my_app.exe"
      VALUE "ProductName", "My App"
      VALUE "ProductVersion", "1.0"
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809, 1252
  END
END

Beachten Sie, dass die langID für UK-Englisch gilt (dies ist die nächstgelegene Lokalisierung zu Australien, die ich identifizieren konnte). Wenn Sie US-Englisch "Englisch" möchten, ändern Sie die BLOCK Zeile in:

BLOCK "040904E4"

und die Übersetzungszeile zu:

VALUE "Translation", 0x409, 1252

Weitere Informationen finden Sie in der VERSIONINFO-Ressource .


5
Es wäre großartig, wenn das Beispiel zeigen würde, wo die ICON-Zeile eingefügt werden soll.
Chacham15


Sie können auch mehrere "Übersetzungen" einfügen (es sagt Windows nur, dass dieses Programm übersetzt ist), indem Sie einfach WORD, WORD-Paare anhängen, zum Beispiel: VALUE "Translation", 0x409, 1252, 0x809, 1252würde sowohl US- als auch UK-Englisch gemäß msdn.microsoft.com/en-us/ aktivieren. library / aa381058.aspx . Dies sagt Ihnen auch, dass Sie mehr als einen 'BLOCK "lang04E4"'
WorldSEnder

Ich habe das kostenlose Dienstprogramm IconsExtractvon Nirsoft verwendet , um ein Symbol in ein von exemir benötigtes Symbol einzubetten .
Evgeni Sergeev

6

In der RC-Datei muss die nameID nicht einmal ein Name sein, sondern kann nur eine Ganzzahl sein. Der Dateiname darf nur in Anführungszeichen gesetzt werden, wenn er ein Leerzeichen enthält. Anstatt:

windres my.rc -O coff -o my.res

Sie können verwenden:

windres my.rc my.o

1
Ich konnte das nicht my.omit MinGWs g++nach windres my.rc my.o(eine WinMainverwandte Fehlermeldung) verknüpfen , aber der windres my.rc -O coff -o my.resPfad funktionierte einwandfrei.
Evgeni Sergeev

.o(= COFF automatisch; ich nenne es der my.res.oKlarheit halber) funktioniert bei mir. Tatsächlich haben .resDateien, wie sie von MSVC erstellt wurden, ein anderes Format, so dass es mit COFF in.res
kxr

1

Versuchen Sie Resource Hacker. Ich konnte mein Projekt unter Linux (WSL) übergreifend kompilieren und aus dem Logo auf der Homepage ein Symbol generieren. Ich brauchte nur einen einfachen Weg, um es in die Exe einzubetten, und dieses Programm funktionierte großartig. Resource Hacker von Angus Johnson


Das war viel einfacher. Öffnen Sie einfach die EXE-Datei, klicken Sie auf "Binär- oder Bildressource hinzufügen", öffnen Sie die ICO-Datei und speichern Sie sie.
Endolith
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.