3

我有一个带有这样的项目文件的小型 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似乎没有附加它,而是假设它,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 不是可接受的解决方案)

4

3 回答 3

7

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

IMO 将它包含在库名称中是个好主意,因为它避免了在 Windows 上发生的臭名昭著的“DLL Hell”,在这种情况下,该约定没有始终如一地遵循......通过命名库文件以包含主要版本号,用户可以安装了多个版本,程序将在运行时使用正确的版本。DLL 版本不一定需要与整个项目发布版本相同。在 Linux 和 OSX 上,版本附加到文件名(例如 librecorder.so.0.0.1)

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

也许您可以省略 VERSION 的定义以禁用此行为,但我现在无法验证 Windows (在 Linux 上,共享库始终具有版本号,它只假定版本 1.0.0。)

于 2009-01-01T14:42:23.247 回答
5

试试这个:

CONFIG += skip_target_version_ext
于 2016-03-15T12:19:46.577 回答
2

有用的技巧

VERSION = 0.0.1
win32:TARGET_EXT = .dll

有了这个,你会得到:

  • 在 Linux 上:librecord.so, ..., librecord.so.0.0.1
  • 在 Windows 上:record.dll
于 2017-02-16T09:26:06.227 回答