2009-01-01 91 views
2

我有一个项目文件这样这个微小的Qt工程:为什么库名称在其名称中另外加上0?

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名字?

将生成的makefile似乎不追加它而只是假设它在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不是accetable溶液)

回答

6

它来自VERSION的第一部分。 “lib”模板正在添加它。

IMO它是一个好主意,将它包含在库名称中,因为它避免了臭名昭着的“DLL地狱”,这发生在Windows不遵守这个惯例的Windows上...通过命名库文件以包含主版本数字,用户可以安装多个版本,程序将在运行时使用正确的版本。 DLL版本并不需要与整个项目发布版本相同。在Linux和OSX上,版本附加到文件名(例如librecorder.so.0.0.1)

[如果使用Visual C++,我还总是添加一个标签,指示从不同版本生成代码后使用的Visual CI版本在很大程度上也是不兼容的。]

也许你可以忽略VERSION的定义来禁止这种行为,但我现在无法验证Windows的适用性(在Linux上,共享库总是有版本号,它只是假定。1.0.0版本)

+0

我测试了它,是的,注释版本使0消失。你也给出了很好的推理,为什么它在那里,所以也许它不是那么糟糕的事情,除了它只使用主要版本,名称不会在0.0.1到0.9.9之间变化,因此,“DLL地狱”可能只是以及发生..谢谢! – Tuminoid 2009-01-01 14:48:26

3

试试这个:

CONFIG += skip_target_version_ext 
+0

谢谢_so_很多... DLL-HELL很糟糕,但被阻塞更多。 – 2016-10-25 03:57:31

0

有用trick

VERSION = 0.0.1 
win32:TARGET_EXT = .dll 

有了这个,你将获得:

  • 在Linux上:librecord.so,...,librecord.so.0.0.1
  • 在Windows上:纪录。 dll
相关问题