ライブラリ名の名前に0が追加されるのはなぜですか?
質問
このような小さな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名に追加されるのはなぜですか?
生成されたメークファイルは追加されていないように見えますが、 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" TEMPLATEが追加しています。
IMOでは、悪名高い「DLL Hell」を回避するため、ライブラリ名に含めることをお勧めします。この規則が一貫して守られていないWindowsで起こります...メジャーバージョン番号を含むようにライブラリファイルに名前を付けると、ユーザーは複数のバージョンをインストールでき、プログラムは実行時に正しいバージョンを使用します。 DLLバージョンは、必ずしもプロジェクトのリリースバージョン全体と同じである必要はありません。 LinuxおよびOSXでは、バージョンはファイル名に追加されます(例:librecorder.so.0.0.1)
[Visual C ++を使用している場合、異なるバージョンで生成されたコードはほとんど互換性がないため、使用したVisual Cのバージョンを示すタグも常に追加します。]
たぶん、VERSIONの定義を省略してこの動作を無効にすることもできますが、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