3 Stimmen

Warum bekommt der Bibliotheksname eine zusätzliche 0 in seinem Namen?

Ich habe dieses winzige Qt-Projekt mit einer Projektdatei wie dieser:

TEMPLATE = lib
TARGET = record32
VERSION = 0.0.1
DEPENDPATH += .
INCLUDEPATH += .

CONFIG += shared
SOURCES += recorder.cpp
HEADERS += recorder.h

Wenn ich eine Bibliothek daraus erstelle mit qmake && nmake, resultiert es in Dateien

record32.obj
record320.lib
record320.dll
...

Warum wird eine zusätzliche 0 zu den lib- und dll-Namen hinzugefügt?

Die generierten Makefiles scheinen es nicht anzuhängen, sondern es einfach anzunehmen, in Makefile.Release steht einfach:

####### Files

SOURCES       = recorder.cpp release\moc_recorder.cpp
OBJECTS       = release\recorder.obj release\moc_recorder.obj
DIST          = 
QMAKE_TARGET  = recorder
DESTDIR        = release\ #Vermeide Zeilenumbruch am Ende
TARGET         = record320.dll
DESTDIR_TARGET = release\record320.dll

Wie kann ich das verhindern und meine Bibliotheken nach Wunsch benennen?

(Beachten Sie, dass das manuelle Ändern der makefile.release keine akzeptable Lösung ist)

7voto

Reed Hedges Punkte 1583

Es stammt aus dem ersten Teil von VERSION. Die "lib" VORLAGE fügt es hinzu.

Meiner Meinung nach ist es eine gute Idee, es in den Bibliotheksnamen aufzunehmen, da dies das berüchtigte "DLL-Höllen"-Problem vermeidet, das auf Windows auftritt, wenn diese Konvention nicht konsequent eingehalten wird... Indem die Bibliotheksdateien benannt werden, um die Hauptversionsnummer einzubeziehen, können Benutzer mehrere Versionen installiert haben und Programme verwenden die richtigen Versionen zur Laufzeit. Die DLL-Version muss nicht unbedingt mit der Gesamtprojektveröffentlichungsversion übereinstimmen. Auf Linux und OSX werden die Versionen an den Dateinamen angehängt (z. B. librecorder.so.0.0.1)

[Wenn Sie Visual C++ verwenden, füge ich auch immer einen Tag hinzu, der anzeigt, welche Version von Visual C ich verwendet habe, da der von den verschiedenen Versionen generierte Code größtenteils inkompatibel ist.]

Vielleicht können Sie einfach die Definition von VERSION auslassen, um dieses Verhalten zu deaktivieren, aber ich kann das im Moment nicht für Windows überprüfen (Auf Linux, wo freigegebene Bibliotheken immer Versionsnummern haben, wird einfach die Version 1.0.0 angenommen.)

0 Stimmen

Ich habe es getestet und ja, wenn man die Version auskommentiert, verschwindet die 0. Du hast auch gute Gründe dafür genannt, warum sie dort ist, also ist es vielleicht gar nicht so schlimm, da es nur die Hauptversion verwendet, der Name ändert sich ja überhaupt nicht zwischen 0.0.1 und 0.9.9 und deshalb könnte möglicherweise auch das "DLL-Problem" auftreten.. Danke!

0 Stimmen

Das Zuweisen eines neuen Dateinamens für jede Version ist nicht praktikabel. Der Dateiname wird explizit im Installationsprogramm angegeben und auch beim Aufruf durch die EXE referenziert. Das Ändern der Quelle jedes Mal ist zu mühsam.

5voto

vitperov Punkte 1267

Versuche dies:

CONFIG += skip_target_version_ext

0 Stimmen

Vielen Dank so sehr... DLL-HELL ist Mist, aber gesperrt zu werden ist noch schlimmer.

2voto

iamantony Punkte 1290

Nützlicher Trick:

VERSION = 0.0.1
win32:TARGET_EXT = .dll

Mit diesem erhalten Sie:

  • auf Linux: librecord.so, ..., librecord.so.0.0.1
  • auf Windows: record.dll

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X