2009-01-01 68 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
相關問題