Почему имя библиотеки получает дополнительный 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 не является доступным решением)
Решение
Это взято из первой части ВЕРСИИ.ШАБЛОН "lib" добавляет его.
ИМО, это хорошая идея включить его в название библиотеки, поскольку это позволяет избежать печально известного "ада DLL", который происходит в Windows, где это соглашение не соблюдается последовательно...Присваивая файлам библиотеки имена, включающие номер основной версии, пользователи могут устанавливать несколько версий, и программы будут использовать правильные версии во время выполнения.Версия библиотеки DLL необязательно должна совпадать с общей версией выпуска проекта.В Linux и OSX версии добавляются к имени файла (например,librecorder.so.0.0.1)
[При использовании Visual C ++ я также всегда добавляю тег, указывающий, какую версию Visual C я использовал, поскольку код, сгенерированный разными версиями, также в значительной степени несовместим.]
Возможно, вы можете просто опустить определение ВЕРСИИ, чтобы отключить это поведение, но я не могу проверить это прямо сейчас для Windows (в Linux, где разделяемые библиотеки всегда имеют номера версий, это просто предполагает версию 1.0.0.)
Другие советы
Попробуй это:
CONFIG += skip_target_version_ext
Полезный трюк:
VERSION = 0.0.1
win32:TARGET_EXT = .dll
С помощью этого вы получите:
- в Linux:librecord.so , ..., librecord.so.0.0.1
- в Windows:record.dll