¿Por qué el nombre de la biblioteca obtiene un 0 adicional en su nombre?
Pregunta
Tengo este pequeño proyecto Qt con un archivo de proyecto como este:
TEMPLATE = lib
TARGET = record32
VERSION = 0.0.1
DEPENDPATH += .
INCLUDEPATH += .
CONFIG += shared
SOURCES += recorder.cpp
HEADERS += recorder.h
Cuando compilo una biblioteca de ella mediante qmake & amp; & amp; nmake
, resulta en archivos
record32.obj
record320.lib
record320.dll
...
¿Por qué se agrega ese 0 adicional a los nombres lib y dll?
Los makefiles generados parecen no estar agregándolos, sino que simplemente asumen que, en Makefile.Release
simplemente dice:
####### 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
¿Cómo puedo prevenirlo y nombrar mis bibliotecas como desee?
(Tenga en cuenta que corregir el archivo makefile.release no es una solución accesible)
Solución
Viene de la primera parte de VERSION. El " lib " TEMPLATE lo está agregando.
OMI es una buena idea incluirlo en el nombre de la biblioteca, ya que evita el infame " DLL Hell " eso sucede en Windows donde no se sigue esta convención sistemáticamente ... Al nombrar los archivos de la biblioteca para incluir el número de versión principal, los usuarios pueden tener varias versiones instaladas y los programas usarán las versiones correctas en el tiempo de ejecución. La versión DLL no necesariamente tiene que ser la misma que la versión de lanzamiento general del proyecto. En Linux y OSX, las versiones se agregan al nombre de archivo (por ejemplo, librecorder.so.0.0.1)
[Si utilizo Visual C ++, también siempre agrego una etiqueta que indica qué versión de Visual C usé, ya que el código generado por las diferentes versiones también es incompatible en gran medida.]
Tal vez solo puede omitir la definición de VERSIÓN para deshabilitar este comportamiento, pero no puedo verificarlo ahora mismo para Windows (en Linux, donde las bibliotecas compartidas siempre tienen números de versión, solo asume la versión 1.0.0.)
Otros consejos
Prueba esto:
CONFIG += skip_target_version_ext
Útil truco :
VERSION = 0.0.1
win32:TARGET_EXT = .dll
Con esto obtendrás:
- en Linux: librecord.so, ..., librecord.so.0.0.1
- en Windows: record.dll