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

StackOverflow https://stackoverflow.com/questions/404774

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть этот крошечный проект 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top