Почему имя библиотеки получает дополнительный 0 в своем имени?

У меня есть этот крошечный проект Qt с таким файлом проекта:

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

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

Когда я компилирую из него библиотеку qmake && nmake, получается файлы

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

Почему к именам lib и dll добавлен дополнительный 0?

Сгенерированные make-файлы, похоже, не добавляют его, а просто предполагают, в Makefile.Release он просто говорит:

####### Files

SOURCES       = recorder.cpp release\moc_recorder.cpp
OBJECTS       = release\recorder.obj release\moc_recorder.obj
DIST          = 
QMAKE_TARGET  = recorder
DESTDIR        = release\ #avoid trailing-slash linebreak
TARGET         = record320.dll
DESTDIR_TARGET = release\record320.dll

Как я могу предотвратить это и назвать свои библиотеки по своему усмотрению?

(Обратите внимание, что ручное исправление файла makefile.release не является приемлемым решением)


person Tuminoid    schedule 01.01.2009    source источник


Ответы (3)


Это происходит из первой части VERSION. ШАБЛОН "lib" добавляет его.

IMO, рекомендуется включить его в имя библиотеки, поскольку это позволяет избежать печально известного «ада DLL», который происходит в Windows, где это соглашение не соблюдается последовательно ... Называя файлы библиотеки, чтобы включить номер основной версии, пользователи могут иметь несколько установленных версий, и программы будут использовать правильные версии во время выполнения. Версия DLL не обязательно должна совпадать с общей версией выпуска проекта. В Linux и OSX версии добавляются к имени файла (например, librecorder.so.0.0.1)

[При использовании Visual C++ я также всегда добавляю тег, указывающий, какую версию Visual C я использовал, поскольку код, сгенерированный разными версиями, также в значительной степени несовместим.]

Возможно, вы можете просто опустить определение ВЕРСИИ, чтобы отключить это поведение, но я не могу проверить это прямо сейчас для Windows (в Linux, где общие библиотеки всегда имеют номера версий, это просто предполагает версию 1.0.0).

person Reed Hedges    schedule 01.01.2009
comment
Я проверил это, и да, закомментировав версию, 0 исчезнет. Вы также хорошо объяснили, почему он существует, так что, возможно, это не так уж и плохо, кроме того, что он использует только основную версию, имя вообще не меняется между 0.0.1 и 0.9.9, и, таким образом, ад DLL может так же хорошо бывает.. Спасибо! - person Tuminoid; 01.01.2009
comment
Давать каждой версии новое имя файла нецелесообразно. Имя файла явно указывается в установщике установщика и при вызове EXE. Каждый раз менять источник слишком хлопотно. - person Pierre; 15.04.2021

Попробуй это:

CONFIG += skip_target_version_ext
person vitperov    schedule 15.03.2016
comment
Большое вам большое спасибо... DLL-HELL отстой, но быть заблокированным еще хуже. - person kayleeFrye_onDeck; 25.10.2016

Полезный трюк:

VERSION = 0.0.1
win32:TARGET_EXT = .dll

При этом вы получите:

  • в Linux: librecord.so, ..., librecord.so.0.0.1
  • в Windows: record.dll
person iamantony    schedule 16.02.2017