Почему имя библиотеки получает дополнительный 0 в названии? - PullRequest
2 голосов
/ 01 января 2009

У меня есть этот крошечный проект 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
...

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

Генерируемые 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 вручную не является приемлемым решением)

Ответы [ 3 ]

6 голосов
/ 01 января 2009

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

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

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

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

3 голосов
/ 15 марта 2016

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

CONFIG += skip_target_version_ext
1 голос
/ 16 февраля 2017

Полезно Трюк :

VERSION = 0.0.1
win32:TARGET_EXT = .dll

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

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